C# — WinForm TCP连接之客户端

TCP连接之客户端,涉及到如下三个函数,分别是:

/*****************************
  ** 函数功能:
     用于与服务端进行TCP连接
  ** 输入参数: 
      IP:IP地址
        Port:端口号        
  ** 输出参数:
 ******************************/
 private void ClientConnect(string IP, string Port){}
/******************************
 ** 函数功能:
    用于向服务端发送信息
 ** 输入参数: 
     MsgType:TCP协议中的协议头部
 ** 输出参数:
 ******************************/
 private void ClientSendMsg(ushort MsgType){}
/******************************
  ** 函数功能:
     接受服务端发回的信息
  ** 输入参数: 
  ** 输出参数:
 ******************************/
  private void RecMsg(){}

三者的关系图如下:

具体代码如下:

1、ClientConnect()

View Code
/******************************
  ** 作者: ***
 ** 变更时间: 2012-12-02
 ******************************/
 #region 连接服务端方法
 private void ClientConnect(string IP, string Port)
 {
     //定义一个套字节监听  包含3个参数(IP4寻址协议,流式连接,TCP协议)
     socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

     //需要获取文本框中的IP地址
    IPAddress ipaddress = IPAddress.Parse(IP);
     //将获取的ip地址和端口号绑定到网络节点endpoint上
   IPEndPoint endpoint = new IPEndPoint(ipaddress, int.Parse(Port));

     //这里客户端套接字连接到网络节点(服务端)用的方法是Connect 而不是Bind
     socketClient.Connect(endpoint);

     //创建一个线程 用于监听服务端发来的消息
    threadClient = new Thread(RecMsg);

     //将窗体线程设置为与后台同步
    threadClient.IsBackground = true;

     //启动线程
    threadClient.Start();
 }
 #endregion

2、ClientSendMsg()

View Code
/******************************
  ** 作者: ***
 ** 变更时间: 2012-12-02
 ******************************/
 #region 发送节目全屏byte串信息到服务端的方法
 private void ClientSendMsg(ushort MsgType)
 {
      //调用客户端套接字发送字节数组
     socketClient.Send(addHeadBody);
 }
 #endregion

3、RecMsg()

View Code
/******************************
  ** 作者: 郭乐彬
  ** 变更时间: 2012-11-30
 ******************************/
 #region 接收服务端发来信息的方法
 private void RecMsg()
 {
     while (true) //持续监听服务端发来的消息
    {
         //定义一个1024*200的内存缓冲区 用于临时性存储接收到的信息
       byte[] arrRecMsg = new byte[1024 * 200];

         //将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度
       int length = socketClient.Receive(arrRecMsg);

        byte[] tem = new byte[24];
        Array.Copy(arrRecMsg, 0, tem, 0, 24);

        ByteToObject bytetoobject = new ByteToObject();
        //MsgHead为一个自定义的结构体
        MsgHead msghead = (MsgHead)bytetoobject.BytesToStuct(tem, typeof(MsgHead));
  
        switch (msghead.MsgType)
        {
              //根据自定义的TCP协议中规定的头部来决定后面的操作
       }
     }
}
原文地址:https://www.cnblogs.com/guolebin7/p/3006521.html