> 技术文档 > c#TCP客户端实现,利用标志位处理接收得消息_tcp receive 接收事件 c#

c#TCP客户端实现,利用标志位处理接收得消息_tcp receive 接收事件 c#

一、客户端

private static Socket socket; 

public static string Connect(string ip, int port)
  {
      if (socket != null)
      {
          return \"已连接\";
      }
      IPAddress IP = IPAddress.Parse(ip);
      socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

      try
      {
          res = socket.BeginConnect(new IPEndPoint(IP, port), null, null);
          res.AsyncWaitHandle.WaitOne(2000, true);
          if (res.IsCompleted)
          {
              socket.ReceiveTimeout = 2000;
              //接收线程
              Task.Run(() => ReceivedAsync());
              return \"连接成功\";
          }
          else
          {
              socket.Close();
              socket = null;
              return \"连接失败\";
          }
      }
      catch (Exception e)
      {
          socket.Close();
          socket = null;
          return $\"连接错误{e.Message}\";
      }
  }

//利用标志位进行接收消息

 static string terminateString = \"\\r\\r\";

public static async Task ReceivedAsync()
{
    try
    {
        socket.ReceiveTimeout = 1000;
        byte[] arrRecMsg = new byte[1024 * 1024];
        int rnFixLength = terminateString.Length;
        while (true)
        {
            //定义一个1M的内存缓冲区 用于临时性存储接收到的信息
            //将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度
            //int length = socket.Receive(arrRecMsg);
            int received = await socket.ReceiveAsync(new ArraySegment(arrRecMsg), SocketFlags.None);
            //将套接字获取到的字节数组转换为人可以看懂的字符串
            //string strRecMsg = Encoding.Default.GetString(arrRecMsg, 0, received);
            string strRecMsg = Encoding.Default.GetString(arrRecMsg, 0, received);
            if (\"\".Equals(strRecMsg))
            {
                LogHelper.EnQueueLog(\"服务器已断开\");
                DisConnect();

                return;
            }
            //遍历接收到的buffer文本
            for (int i = 0; i < strRecMsg.Length;)
            {
                if (i <= strRecMsg.Length - rnFixLength)
                {
                    if (strRecMsg.Substring(i, rnFixLength) != terminateString)//非消息结束符,则加入sb
                    {
                        sb.Append(strRecMsg[i]);
                        i++;
                    }
                    else
                    {
                        string msg = sb.ToString();
                        LogHelper.EnQueueLog(msg);
                        //StorageQueueList.Enqueue(strRecMsg);
                        ProcessTcpLog(msg);
                        sb.Clear();
                        i += rnFixLength;
                    }
                }
                else
                {
                    sb.Append(strRecMsg[i]);
                    i++;
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($\"远程服务器已中断连接...{ex.Message}\");
    }
}

 public static void ProcessTcpLog(string msg)
 {
//消息处理
 }

//发送消息

  public static bool SendMessage(string msg)
  {
      //byte[] buffer = Encoding.Default.GetBytes(msg+\"/r/n\");
      byte[] buffer = Encoding.Default.GetBytes(msg + \'\\r\');
      return SendSeverMessage(buffer, buffer.Length);
  }
  private static bool SendSeverMessage(byte[] sendBuffer, int size)
  {
      if (res != null && res.IsCompleted && socket != null)
      {
          try
          {
              socket.BeginSend(sendBuffer, 0, size, SocketFlags.None, null, null);
              return true;
          }
          catch (Exception) { }
      }
      return false;
  }

//断开连接

 public static string DisConnect()
 {
     if (res.IsCompleted && socket != null)
     {
         try
         {
             socket.Shutdown(SocketShutdown.Both);
             socket.Close();
             socket = null;
             return \"连接已断开\";
         }
         catch (Exception e)
         {
             return $\"连接断开错误{e.Message}\";
         }
     }
     else
     {

         return \"未检测到连接\";
     }
 }