• C# Socket的TCP通讯 异步 (2015-11-07 10:07:19)转载▼


    1.  异步 
       相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下执行。详细见下面:
      

    服务器:

    1、 开启侦听接口

    private TcpListener listener; //监听类

    listener = new TcpListener(new IPEndPoint(IPAddress.Parse(ip), port));

    listener.Start();//开启侦听,对连接的客户端的数目没有限制

    或者

    listener.Start(int i);// 开启侦听,最多只能连接i个客户端数目
    2、 接收客户端

                    listener.BeginAcceptSocket(clientConnect, listener);//异步接受客户端的连接请求  clientConnect为连接的回调函数
    

    ///

        /// 接收回调函数
    
        ///
    
        ///
    
        private void clientConnect(IAsyncResult ar)
    
        {
    
            try
    
            {
    
                TcpListener listener = (TcpListener)ar.AsyncState;
    
                //接受客户的连接,得到连接的Socket
    
                Socket client = listener.EndAcceptSocket(ar);
    
    
    
            }
    
            catch { }
    
        }
    

    3、 接收客户端发送的数据

    ///

        /// 异步接收数据
    
        ///
    
        private void receiveData(Socket client)
    
        {
    
                // 调用异步方法 BeginReceive 来告知 socket 如何接收数据
    
                IAsyncResult iar = client.BeginReceive(buffer, 0, BagSize, SocketFlags.None, out errorCode, receiveCallback, buffer);
            }
     }
    
    
    
        ///
    
        /// 接收数据回调函数
    
        ///
    
        ///
    
        private void receiveCallback(IAsyncResult ar)
    
        {          
    
                //接收到的数据长度.
    
                int receLen = 0;
    
                try
    
                {
    
                    receLen = client.EndReceive(ar, out errorCode);                
    

    if (receLen > 0)

                    {
    
                        OnReceiveData(client);//接收到数据之后的处理函数
    
                    }
    
                }
    
                catch {     }
            }
    
            else { }
    
        }
    

    4、接收成功之后,回发数据给客户端

    ///

        /// 异步发送报文
    
        ///
    
        ///
    
        private void OnReceiveData (Socket socket)
    
        {
    

    string strLogin = “succeed recived”;

    byte[] data = Encoding.ASCII.GetBytes(strLogin);

         socket.BeginSend(data, 0, data.Length, SocketFlags.None, out errorCode, sendCallBack, socket);//异步发送数据
    
            }
    
            else
    
            { }
    
        }
    

    ///

        /// 异步发送回调事件
    
        ///
    
        ///
    
        private void sendCallBack(IAsyncResult ar)
    
        {
    

    socket.EndSend(ar, out errorCode);

          }
    

    客户端

    1、连接服务器

    private TcpClient tcpcz = null

         tcpcz = new TcpClient()
    
    tcpcz.BeginConnect(ipaddress, Convert.ToInt32(port), new AsyncCallback(ConnectCallback), tcpcz);//根据服务器的IP地址和端口号 异步连接服务器
    
    
        ///
    
        /// 异步连接的回调函数
    
        ///
    
        ///
    
        private void ConnectCallback(IAsyncResult ar)
    
        {
    
            TcpClient t = (TcpClient)ar.AsyncState;
    
            try
    
            {
    
                if (t.Connected)
    
                {
    
                    t.EndConnect(ar);//函数运行到这里就说明连接成功
    
                }
    
                else
    
                {
    
                }
    
            }
    
            catch () {    }
        }
    

    2、发送和接收字符串

    NetworkStream stream = tcp.GetStream();//创建于服务器连接的数据流

                  //发送字符串
    
                  string strLogin = “this is socket example”;
    
             byte[] data = Encoding.ASCII.GetBytes(strLogin);
    
          stream.BeginWrite(data, 0, data.Length, new AsyncCallback(SendCallback),stream);//异步发送数据
    
                  //接收字符串
    
                byte[] result = new byte[tcp.Available]; // tcp.Available为接受的字符串大小
                  try
                  {
    
                      stream.BeginRead(result, 0, result.Length, new AsyncCallback(ReadCallback), stream);//异步接受服务器回报的字符串
    
                  }
                  catch { }
                  string strResponse = Encoding.ASCII.GetString(result).Trim();//从服务器接受到的字符串
    
              }
    
          }
          catch ()
          {
          }
      }
  • 相关阅读:
    【持续更新】Java知识点整理-util
    【持续更新】Java知识点整理-基础
    【持续更新】Java知识点整理-JVM
    notepad++中写markdown
    VirtualBox中Alpine Linux + Docker安装记录
    Alpine Linux配置网络
    从编码的历史了解编码
    关于摄影器材的一些知识点
    服务器(Linux)上运行python总结
    命令行运行Python脚本时传入参数的三种方式
  • 原文地址:https://www.cnblogs.com/VictorBlog/p/5197769.html
Copyright © 2020-2023  润新知