client的实现:
public class socket_management : MonoBehaviour{ private TcpClient tcpClient_ = new TcpClient(); public socket_management() { } /// /// 建立 Connect Server. /// public void Init() { tcpClient_.NoDelay = true; //关闭Nagle演算法,这个算法是之前网路不发达的时候才需要的 //初始化callback AsyncCallback connect_callback = null; // 实现callback,这个函数会在connect之后被调用; connect_callback = ar => { tcpClient_.EndConnect(ar);//异步调用的时候需要的; if (tcpClient_.Connected)//判断是否连接成功; { NetworkStream networkStream_connect = tcpClient_.GetStream();//初始化数据流 byte[] tempRecvBuffer = new byte[1024]; if (networkStream_connect.CanRead) { //读取数据; //第4个参数是回调函数,也就是有读到数据的时候,会被调用; //最后一个参数是用来存储数据,看下面的endReadCallback函数的参数,是IAsyncResult类型,这个可以用来存取读到的数据,数据格式是在这个参数自定义的:new了一个object数组,这个object数组只有一个元素,用来接受数据的byte[],使用的时候,可以放入自定义的class structure 等,但是读取的时候要注意排序; networkStream_connect.BeginRead(tempRecvBuffer, 0, 1024, new AsyncCallback(endReadCallback), new object[] { tempRecvBuffer }); } if (networkStream_connect.CanWrite) { //发送数据 byte[] buffer = Encoding.UTF8.GetBytes("hello Server"); Debug.Log("send msg" + buffer.Length); networkStream_connect.BeginWrite(buffer, 0, buffer.Length, new AsyncCallback(endWriteCallback), null); } } }; tcpClient_.BeginConnect(IPAddress.Parse("127.0.0.1"), 7001, new AsyncCallback(connect_callback), tcpClient_); Debug.Log("Init : connect to server"); } ...}
读的回调函数:
private void endReadCallback(IAsyncResult ar) { NetworkStream networkStream = tcpClient_.GetStream(); int packetLength = networkStream.EndRead(ar); if (packetLength > 0) { Debug.Log("get a msg " + packetLength); //获取读到的数据 object[] objArr = (object[])ar.AsyncState; //因爲数组的0个元素是要读的buffer byte[] recvBuffer = (byte[])objArr[0]; Array.Resize(ref recvBuffer, packetLength); //transform to string and print,转换成string类型,并进行打印 string result = System.Text.Encoding.UTF8.GetString(recvBuffer); Debug.Log(result); //这一步一定要写,才会继续读下去 networkStream.BeginRead(recvBuffer, 0, recvBuffer.Length, new AsyncCallback(endReadCallback), new object[] { recvBuffer }); } }
写回调函数:
private void endWriteCallback(IAsyncResult ar) { NetworkStream networkStream = tcpClient_.GetStream(); networkStream.EndWrite(ar); }
效果演示:
用visual studio2019写的c++server,收到什麽数据,就会回复什麽数据:
用unity和vscode写的c#中client端,连上之后,会发一个'hello server',然后把收到的数据打印出来: