HPsocketCS、TCP通信接続と送信

HPsocketCS を使用して TCP に接続し、送信します。
重要な点は、接続がいつデータを受信し、データを送信するかです。
ステップ 1: HPsocket をプロジェクト ファイルに参照する
ここに画像の説明を挿入
ステップ 2: ヘッダー ファイルに参照を書き込む

using HPSocketCS;

ステップ 3: TCP オブジェクトを作成する

TcpServer hpServer = new TcpServer();

ステップ 4: 接続と接続イベントを作成する


            hpServer.OnAccept += HpServer_OnAccept1; //连接事件
            hpServer.OnClose += HpServer_OnClose1;   //断开连接事件
            // 接收数据
            hpServer.OnReceive += HpServer_OnReceive1;
            // 发送数据
            hpServer.OnSend += HpServer_OnSend;
            // 设置服务端IP
            //这里我直接将IP地址写死了,IP地址是一串string类型的字符串
            //所以我们可以在Winform中通过TextBox的形式将IP写入其中
            hpServer.IpAddress = "127.0.0.1";
            // 设置端口
            //端口号是一个Int类型的数字
            hpServer.Port = Convert.ToUInt16(8000);
            hpServer.SendPolicy = SendPolicy.Direct;
            //在这里我将上位机作为服务端,PLC作为客户端
            //服务端开启
            hpServer.Start();
            string strMsg = "服务端已开启并监听.";
            listBoxMsg.Items.Add(strMsg);
            listBoxMsg.TopIndex = listBoxMsg.Items.Count - 1;
            strMsg = "服务端监听Socket为{0}:{1}.";
            listBoxMsg.Items.Add(strMsg);
            listBoxMsg.TopIndex = listBoxMsg.Items.Count - 1;
            string ipListen = "";
            ushort portListen = 0;
            hpServer.GetListenAddress(ref ipListen, ref portListen);

5番目のステップは、対応する接続​​イベントを作成することです
が、TCPの送信信号はTCPスレッド内で高速ループしているため、信号送信時にOnSend関数に送信信号を記述することができません。
そこで、受信データに承諾シグナルを記述し、実行したいプログラムを呼び出し、実行中のプログラムが終了した後にシグナルを送信します。

 private HandleResult HpServer_OnSend(IntPtr connId, byte[] bytes)
        {
    
    
            return HandleResult.Ok;
        }
        /// <summary>
        /// TCP接受数据,connIdTCP连接句柄,dataTCP获取到的数据
        /// </summary>
        /// <param name="connId"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        private HandleResult HpServer_OnReceive1(IntPtr connId, byte[] data)
        {
    
    
            string test;
            try
            {
    
    
                test = Encoding.Default.GetString(data);
                string strMsg_01 = "服务器接受数据: " + test;
                listBoxMsg.Items.Add(strMsg_01);
                listBoxMsg.TopIndex = listBoxMsg.Items.Count - 1;
                if (test == "abcde")
                {
    
    
                //user()为工作运行程序
                    User();
                    test = "";
                    //在运行程序结束后发送数据出去
                    TCPSend()}
                return HandleResult.Ok;
            }
            catch (Exception)
            {
    
    
                return HandleResult.Ignore;
            }
        }
        private void TCPSend()
        {
    
    
            string sendcenter = Convert.ToString(centerx * 1000) + Convert.ToString(centery * 1000);
            byte[] sendByetcenter = Encoding.Default.GetBytes(sendcenter);
            hpServer.Send(ID, sendByetcenter, sendByetcenter.Length);
        }
        private HandleResult HpServer_OnClose1(IntPtr connId, SocketOperation enOperation, int errorCode)
        {
    
    
            return HandleResult.Ok;
        }

        private HandleResult HpServer_OnAccept1(IntPtr connId, IntPtr pClient)
        {
    
    
            //tCP运行句柄
            ID = connId;
            return HandleResult.Ok;
        }
         private void TCPSend()
        {
    
    
        //sendcenter这个是我们需要发送的信息,先将其转化为字符串再转化为byte类型
            string sendcenter = Convert.ToString(centerx*1000) + Convert.ToString(centery * 1000);
            byte[] sendByetcenter = Encoding.Default.GetBytes(sendcenter);
            //ID是TCP的句柄,我们可以再连接事件中将ID进行赋值,ID的类型是IntPtr的句柄类型
            hpServer.Send(ID, sendByetcenter, sendByetcenter.Length);
        }

レンダリング:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_51559565/article/details/128230637