c#的socket client实现和asyn read and write

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,收到什麽数据,就会回复什麽数据:
http://img2.58codes.com/2024/20139212NV74ekfVW8.png
用unity和vscode写的c#中client端,连上之后,会发一个'hello server',然后把收到的数据打印出来:
http://img2.58codes.com/2024/201392121FA1mJ4wWn.png


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章