C# Scoket异步通讯实现(发送数据、接收数据)

转载连接: http://blog.csdn.net/smartsmile2012/article/details/71172450


  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Net.Sockets;  
  6. using System.Text;  
  7. using System.Threading.Tasks;  
  8.   
  9. namespace TCP_Server  
  10. {  
  11.     class Program  
  12.     {  
  13.         static byte[] buffer = new byte[1024];  
  14.         private static int count = 0;  
  15.         static void Main(string[] args)  
  16.         {  
  17.             WriteLine("server:ready", ConsoleColor.Green); //绿色  
  18.  
  19.             #region 启动程序  
  20.             //①创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字)  
  21.             var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  22.   
  23.             //②将该socket绑定到主机上面的某个端口  
  24.             //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx  
  25.             socket.Bind(new IPEndPoint(IPAddress.Any, 7788));  
  26.   
  27.             //③启动监听,并且设置一个最大的队列长度  
  28.             //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx  
  29.             socket.Listen(10000);  
  30.   
  31.             //④开始接受客户端连接请求  
  32.             //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx  
  33.             socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);  
  34.             Console.ReadLine();  
  35.             #endregion  
  36.         }  
  37.  
  38.         #region 客户端连接成功  
  39.         /// <summary>  
  40.         /// 客户端连接成功  
  41.         /// </summary>  
  42.         /// <param name="ar"></param>  
  43.         public static void ClientAccepted(IAsyncResult ar)  
  44.         {  
  45.             #region  
  46.             //设置计数器  
  47.             count++;  
  48.             var socket = ar.AsyncState as Socket;  
  49.             //这就是客户端的Socket实例,我们后续可以将其保存起来  
  50.             var client = socket.EndAccept(ar);  
  51.             //客户端IP地址和端口信息  
  52.             IPEndPoint clientipe = (IPEndPoint)client.RemoteEndPoint;  
  53.   
  54.             WriteLine(clientipe + " is connected,total connects " + count, ConsoleColor.Yellow);  
  55.   
  56.             //接收客户端的消息(这个和在客户端实现的方式是一样的)异步  
  57.             client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);  
  58.             //准备接受下一个客户端请求(异步)  
  59.             socket.BeginAccept(new AsyncCallback(ClientAccepted), socket);  
  60.             #endregion  
  61.         }  
  62.         #endregion  
  63.  
  64.         #region 接收客户端的信息  
  65.         /// <summary>  
  66.         /// 接收某一个客户端的消息  
  67.         /// </summary>  
  68.         /// <param name="ar"></param>  
  69.         public static void ReceiveMessage(IAsyncResult ar)  
  70.         {  
  71.             int length = 0;  
  72.             string message = "";  
  73.             var socket = ar.AsyncState as Socket;  
  74.             //客户端IP地址和端口信息  
  75.             IPEndPoint clientipe = (IPEndPoint)socket.RemoteEndPoint;  
  76.             try  
  77.             {  
  78.                 #region  
  79.                 //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx  
  80.                 length = socket.EndReceive(ar);  
  81.                 //读取出来消息内容  
  82.                 message = Encoding.UTF8.GetString(buffer, 0, length);  
  83.                 //输出接收信息  
  84.                 WriteLine(clientipe + " :" + message, ConsoleColor.White);  
  85.                 //服务器发送消息  
  86.                 socket.Send(Encoding.UTF8.GetBytes("server received data")); //默认Unicode  
  87.                 //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息)异步  
  88.                 socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);  
  89.                 #endregion  
  90.             }  
  91.             catch (Exception ex)  
  92.             {  
  93.                 //设置计数器  
  94.                 count--;  
  95.                 //断开连接  
  96.                 WriteLine(clientipe + " is disconnected,total connects " + (count), ConsoleColor.Red);  
  97.             }  
  98.         }  
  99.         #endregion  
  100.  
  101.         #region 扩展方法  
  102.         public static void WriteLine(string str, ConsoleColor color)  
  103.         {  
  104.             Console.ForegroundColor = color;  
  105.             Console.WriteLine("[{0}] {1}", DateTime.Now.ToString("MM-dd HH:mm:ss"), str);  
  106.         }  
  107.         #endregion  
  108.     }  
  109. }  

[csharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Net;  
  5. using System.Net.Sockets;  
  6. using System.Text;  
  7. using System.Threading.Tasks;  
  8.   
  9. namespace TCP_Client  
  10. {  
  11.     class Program  
  12.     {  
  13.         static byte[] buffer = new byte[1024];  
  14.         static void Main(string[] args)  
  15.         {  
  16.             try  
  17.             {  
  18.                 //①创建一个Socket  
  19.                 var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  20.   
  21.                 //②连接到指定服务器的指定端口  
  22.                 socket.Connect("127.0.0.1", 7788); //localhost代表本机  
  23.   
  24.                 WriteLine("client:connect to server success!", ConsoleColor.White);  
  25.   
  26.                 //③实现异步接受消息的方法 客户端不断监听消息  
  27.                 socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);  
  28.   
  29.                 //④接受用户输入,将消息发送给服务器端  
  30.                 while (true)  
  31.                 {  
  32.                     var message = Console.ReadLine();  
  33.                     var outputBuffer = Encoding.UTF8.GetBytes(message);  
  34.                     socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, nullnull);  
  35.                 }  
  36.             }  
  37.             catch (Exception ex)  
  38.             {  
  39.                 WriteLine("client:error " + ex.Message, ConsoleColor.Red);  
  40.             }  
  41.             finally  
  42.             {  
  43.                 Console.Read();  
  44.             }  
  45.   
  46.         }  
  47.  
  48.         #region 接收信息  
  49.         /// <summary>  
  50.         /// 接收信息  
  51.         /// </summary>  
  52.         /// <param name="ar"></param>  
  53.         public static void ReceiveMessage(IAsyncResult ar)  
  54.         {  
  55.             try  
  56.             {  
  57.                 var socket = ar.AsyncState as Socket;  
  58.   
  59.                 //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx  
  60.                 var length = socket.EndReceive(ar);  
  61.                 //读取出来消息内容  
  62.                 var message = Encoding.ASCII.GetString(buffer, 0, length);  
  63.   
  64.                 //显示消息  
  65.                 WriteLine(message, ConsoleColor.White);  
  66.   
  67.                 //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了)  
  68.                 socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);  
  69.             }  
  70.             catch (Exception ex)  
  71.             {  
  72.                 WriteLine(ex.Message, ConsoleColor.Red);  
  73.             }  
  74.         }  
  75.         #endregion  
  76.  
  77.         #region 扩展方法  
  78.         public static void WriteLine(string str, ConsoleColor color)  
  79.         {  
  80.             Console.ForegroundColor = color;  
  81.             Console.WriteLine("[{0}] {1}", DateTime.Now.ToString("MM-dd HH:mm:ss"), str);  
  82.         }  
  83.         #endregion  
  84.     }  
  85. }  

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值