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

xiaoxiao2021-02-27  231

using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace TCP_Server { class Program { static byte[] buffer = new byte[1024]; private static int count = 0; static void Main(string[] args) { WriteLine("server:ready", ConsoleColor.Green); //绿色 #region 启动程序 //①创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字) var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //②将该socket绑定到主机上面的某个端口 //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.bind.aspx socket.Bind(new IPEndPoint(IPAddress.Any, 7788)); //③启动监听,并且设置一个最大的队列长度 //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.listen(v=VS.100).aspx socket.Listen(10000); //④开始接受客户端连接请求 //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.beginaccept.aspx socket.BeginAccept(new AsyncCallback(ClientAccepted), socket); Console.ReadLine(); #endregion } #region 客户端连接成功 /// <summary> /// 客户端连接成功 /// </summary> /// <param name="ar"></param> public static void ClientAccepted(IAsyncResult ar) { #region //设置计数器 count++; var socket = ar.AsyncState as Socket; //这就是客户端的Socket实例,我们后续可以将其保存起来 var client = socket.EndAccept(ar); //客户端IP地址和端口信息 IPEndPoint clientipe = (IPEndPoint)client.RemoteEndPoint; WriteLine(clientipe + " is connected,total connects " + count, ConsoleColor.Yellow); //接收客户端的消息(这个和在客户端实现的方式是一样的)异步 client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client); //准备接受下一个客户端请求(异步) socket.BeginAccept(new AsyncCallback(ClientAccepted), socket); #endregion } #endregion #region 接收客户端的信息 /// <summary> /// 接收某一个客户端的消息 /// </summary> /// <param name="ar"></param> public static void ReceiveMessage(IAsyncResult ar) { int length = 0; string message = ""; var socket = ar.AsyncState as Socket; //客户端IP地址和端口信息 IPEndPoint clientipe = (IPEndPoint)socket.RemoteEndPoint; try { #region //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx length = socket.EndReceive(ar); //读取出来消息内容 message = Encoding.UTF8.GetString(buffer, 0, length); //输出接收信息 WriteLine(clientipe + " :" + message, ConsoleColor.White); //服务器发送消息 socket.Send(Encoding.UTF8.GetBytes("server received data")); //默认Unicode //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息)异步 socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); #endregion } catch (Exception ex) { //设置计数器 count--; //断开连接 WriteLine(clientipe + " is disconnected,total connects " + (count), ConsoleColor.Red); } } #endregion #region 扩展方法 public static void WriteLine(string str, ConsoleColor color) { Console.ForegroundColor = color; Console.WriteLine("[{0}] {1}", DateTime.Now.ToString("MM-dd HH:mm:ss"), str); } #endregion } } using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace TCP_Client { class Program { static byte[] buffer = new byte[1024]; static void Main(string[] args) { try { //①创建一个Socket var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //②连接到指定服务器的指定端口 socket.Connect("127.0.0.1", 7788); //localhost代表本机 WriteLine("client:connect to server success!", ConsoleColor.White); //③实现异步接受消息的方法 客户端不断监听消息 socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); //④接受用户输入,将消息发送给服务器端 while (true) { var message = Console.ReadLine(); var outputBuffer = Encoding.UTF8.GetBytes(message); socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null); } } catch (Exception ex) { WriteLine("client:error " + ex.Message, ConsoleColor.Red); } finally { Console.Read(); } } #region 接收信息 /// <summary> /// 接收信息 /// </summary> /// <param name="ar"></param> public static void ReceiveMessage(IAsyncResult ar) { try { var socket = ar.AsyncState as Socket; //方法参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.endreceive.aspx var length = socket.EndReceive(ar); //读取出来消息内容 var message = Encoding.ASCII.GetString(buffer, 0, length); //显示消息 WriteLine(message, ConsoleColor.White); //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了) socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket); } catch (Exception ex) { WriteLine(ex.Message, ConsoleColor.Red); } } #endregion #region 扩展方法 public static void WriteLine(string str, ConsoleColor color) { Console.ForegroundColor = color; Console.WriteLine("[{0}] {1}", DateTime.Now.ToString("MM-dd HH:mm:ss"), str); } #endregion } }
转载请注明原文地址: https://www.6miu.com/read-5545.html

最新回复(0)