Advertisement

c# Socket发送与接收方法

阅读量:

客户端:

复制代码
   /// <summary>

    
     /// socket发送字节数组
    
     /// </summary>
    
     /// <param name="sendData">要发送的byte[]</param>
    
     /// <param name="ip">服务器IP</param>
    
     /// <param name="port">服务器端口</param>
    
     /// <returns>接收的byte[]</returns>
    
     public static byte[] SendBySocket(byte[] sendData, string ip, int port)
    
     {
    
         byte[] byteReceive = null;
    
         try
    
         {               
    
             IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Parse(ip), port);           
    
             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
             socket.Connect(IPAddress.Parse(ip), port);
    
             socket.Send(sendData);
    
             int count, size = 512;
    
             byte[] data = new byte[size];
    
             MemoryStream ms = new MemoryStream();
    
             while (0 != (count = socket.Receive(data, size, SocketFlags.None)))
    
                 ms.Write(data, 0, count);
    
             byteReceive = ms.ToArray();
    
             ms.Close();
    
             //方法2
    
                 //int bytes = 0;
    
                 //MemoryStream ms = new MemoryStream();
    
                 //while (true)
    
                 //{
    
                 //    byte[] byteMessage = new byte[10];
    
                 //    bytes = socket.Receive(byteMessage, byteMessage.Length, 0);
    
                 //    if (bytes <= 0)
    
                 //        break;
    
                 //    ms.Write(byteMessage, 0, bytes);
    
                 //}
    
                 //byteReceive = ms.ToArray();
    
                 //ms.Close();
    
  
    
                 socket.Shutdown(SocketShutdown.Both);
    
             socket.Close();               
    
         }
    
         catch
    
         {
    
             return null;
    
         }
    
         return byteReceive;
    
     }
    
    
    
    
    代码解读

服务端:

复制代码
     bool btnstatu = true;  //开始停止服务状态  
    
     Socket listener;
    
     //开始停止服务按钮
    
     private void btnStart_Click(object sender, EventArgs e)
    
     {       
    
         CancellationTokenSource cts = new CancellationTokenSource();
    
         Task task = new Task(() => Listen(cts.Token), cts.Token);
    
  
    
         if (btnstatu)
    
         {
    
             task.Start();
    
             statuBar.Text = "服务已启动,等待客户端连接";
    
             btnstatu = false;
    
             btnStart.Text = "停止服务";
    
         }
    
         else
    
         {
    
             if (listener != null)
    
             {
    
                 listener.Close();
    
                 listener = null;
    
             }            
    
             cts.Cancel();
    
  
    
             statuBar.Text = "服务端已停止服务";
    
             btnstatu = true;
    
             btnStart.Text = "开始服务";
    
             statuBar.Text = "服务已停止";
    
         }
    
     }
    
     //监听函数
    
     private void Listen(CancellationToken cts)
    
     {
    
         cts.ThrowIfCancellationRequested();
    
         listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
         listener.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    
         IPEndPoint iep = new IPEndPoint(IPAddress.Any, ServerConfig.ServerPort);
    
         try
    
         {
    
             listener.Bind(iep);
    
             listener.Listen(10);
    
             while (true)
    
             {
    
                 Socket accept = listener.Accept();
    
                 byte[] byteMessage = new byte[1024];
    
                 accept.Receive(byteMessage);
    
 		    string recvMsg = Encoding.Default.GetString(byteMessage).Replace("\0", "");                   
    
                 ShowText(DateTime.Now.ToString("[HH:mm:ss]") + accept.RemoteEndPoint.ToString() + "说:" + recvMsg); 
    
                 string sendMsg = "已收到消息";
    
                 accept.Send(Encoding.Default.GetBytes(sendMsg));
    
                 accept.Shutdown(SocketShutdown.Both);
    
                 accept.Close();
    
             }
    
         }
    
         catch 
    
         {              
    
         }
    
     }
    
     private void ShowText(string msg)
    
     {
    
         richTextBox1.SafeCall(() =>
    
         {
    
             richTextBox1.AppendText(msg);
    
             richTextBox1.AppendText(System.Environment.NewLine);
    
         });
    
     }
    
    
    
    
    代码解读

全部评论 (0)

还没有任何评论哟~