Unity3D与Node.js通过TCP通信

Node.js端.需要的库就是我LighterWebEngine的TCP封装. 可以去我的Github上面下载,

var tcp = require("./LighterWebEngine/TCP");

tcp.CreateServer(10000,
    function(){ //初始化回调

    },
    function(hSocket, sBuffer){ //有客户端发送消息过来.. sBuffer就是数据. 
        console.log(sBuffer.toString()); //打印客户端发来的消息 "join success!"
    },
    function(hSocket){ //和客户端断开连接

    },
    function(hSocket){ //连接成功
        hSocket.write('hello World!'); //发送给客户端一个 "hello world"
        hSocket.end();
    }
);

unity3d这边其实非常简单.mono就是c#嘛..c#有个tcpclient库.直接加载就可以使用了哈.

using System.Net.Sockets; 
using System.Text;

TcpClient tcpClient = new TcpClient(); //创建一个本地连接 端口是10000的
tcpClient.Connect("127.0.0.1", 10000);

NetworkStream clientStream = tcpClient.GetStream(); //获取stream. 通过stream可以收数据和发数据
byte[] message = new byte[4096];
int bytesRead;
bytesRead = 0;
bytesRead = clientStream.Read(message, 0, 4096); //收到数据 "hello world!"

UTF8Encoding encoder = new UTF8Encoding();
MonoBehaviour.print(encoder.GetString(message, 0, bytesRead)); //转化数据为utf8字符串并打印出来

byte[] outStream = Encoding.UTF8.GetBytes("joining success!"); //发送一个加入成功的包给服务器.
clientStream.Write(outStream, 0, outStream.Length);
clientStream.Flush();

tcpClient.Close(); //关闭连接

一个简单的基于node.js的TCP服务器和基于C++的TCP客户端通信示例程序

var net=require("net");
var serverIP="127.0.0.1";
var serverPort=10553;

var server=net.createServer(function(sock){
    console.log("Accepting connection: " + sock.remoteAddress + ":" + sock.remotePort );
    
    sock.write("Login server based on Node.js success!");
    
    sock.on("data",function(data){
        console.log(sock.remoteAddress + ":" + sock.remotePort + " -> " + data);
        
        sock.write('Node.js server has received data"' + data + '"');
    });
    
    /*客户端调用closesocket或强制关闭时会导致服务器端会发射"close"事件,但是它发生在"error"事件之后。
    sock.remoteAddress和sock.remotePort是undefined.*/
    sock.on("close",function(data){
        console.log(sock.remoteAddress + ":" + sock.remotePort + " logout!");
    });
    
    /*必须监听一个“error”事件,否则在客户端调用closesocket或强制关闭时服务器端会发射“error"事件。
    如果没有该事件的处理程序,进程便会异常终止。*/
    sock.on("error",function(error,data){
        if(error)
        {
            console.log("Occurs an error: " + error);
        }
    });
});
server.listen(serverPort,serverIP);
console.log("server listening at " + serverIP + ":" + serverPort);
console.log("Waiting connection ... ...");

以下是C++客户端程序的示例代码

 

#include <winsock2.h>
#pragma comment (lib,"Ws2_32.lib")
#include <windows.h>
#include <iostream>
#include <string>
using std::cout;
using std::cin;
using std::endl;
using std::cerr;
using std::string;

bool InitSocketLibrary(void)
{
    WORD wVersionRequested;
    WSADATA wsaData;
    
    wVersionRequested = MAKEWORD(2,2);

    int err =WSAStartup(wVersionRequested,&wsaData);
    if ( err != 0 )
    {
        return false;
    }
    if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
    {
        WSACleanup();
        return false;
    }

    return true;
}
int main()
{
    if(!InitSocketLibrary())
    {
        cerr << "Fail to initialize WinSock!" << endl;
        return -1;
    }

    SOCKET sock=socket(AF_INET,SOCK_STREAM,0);

    SOCKADDR_IN addrBind;
    addrBind.sin_family=AF_INET;
    addrBind.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    addrBind.sin_port=htons(0);
    int nRet=bind(sock,(SOCKADDR*)&addrBind,sizeof(SOCKADDR_IN));
    if(nRet==SOCKET_ERROR)
    {
        cerr << "Error,fail to bind socket:" << WSAGetLastError() << endl;
    }

    SOCKADDR_IN addrSrv;
    addrSrv.sin_family=AF_INET;
    addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    addrSrv.sin_port=htons(10553);

    nRet=connect(sock,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR_IN));
    if(nRet==SOCKET_ERROR)
    {
        cout << "Fail to connection server!" << endl;
        return 0;
    }

    char recvBuf[100]={0};
    nRet=recv(sock,recvBuf,100,0);
    if(nRet>0)
    {
        recvBuf[nRet]=0;
        cout << recvBuf << endl;

        cout << "input something to send('#'to quit): ";

        string strContent;
        while(true)
        {
            getline(cin,strContent);
            if(strContent.at(0)=='#')
                break;
            send(sock,strContent.c_str(),strContent.length(),0);
        }
        

        closesocket(sock);
        WSACleanup();
    }
}

 

posted on 2020-02-28 10:24  小魔一剑  阅读(610)  评论(0编辑  收藏  举报