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,收到什麽数据,就会回复什麽数据:
https://ithelp.ithome.com.tw/upload/images/20210804/20139212NV74ekfVW8.png
用unity和vscode写的c#中client端,连上之後,会发一个'hello server',然後把收到的数据打印出来:
https://ithelp.ithome.com.tw/upload/images/20210804/201392121FA1mJ4wWn.png


<<:  Vue 如何在 LocalHost 开发环境时使用 HTTPS

>>:  透过 Composer 安装、更新、移除 PHP 套件或框架(PHP, Composer套件管理)

Azure - Day5 Azure Function

Hi~大家好,我今天想要分享的实作包括如下: < Azure Function > 1....

数字证书(Digital Certificate)

证书申请和回应 证书签名请求(Certificate Signing Request) 在公钥基础结...

Day 27 - Detect Capital

大家好,我是毛毛。ヾ(´∀ ˋ)ノ 废话不多说开始今天的解题Day~ 520. Detect Cap...

Day23-Vuex核心概念与结构(part1)

结构 主要可以分为四个部分「state」、「getters」、「mutation」、「actions...

事件查看练习(二)--如何研究一个警告事件

今天来继续看事件检视器,笔者挑一些自己笔电常出现的警告来分享,最近发现我的电脑似乎还算健康没什麽大问...