C#异步TCP通讯服务端

您所在的位置:网站首页 TCP端口扫描代码 C#异步TCP通讯服务端

C#异步TCP通讯服务端

2023-06-27 11:55| 来源: 网络整理| 查看: 265

        #region 用户客户端连接socket         private class StateObject         {             // Client socket.             public Socket workSocket = null;             // 接收缓存区大小.             public const int BufferSize = 1024 * 1024;             //接收缓存区.             public byte[] buffer = new byte[BufferSize];             // 接收的数据字符串             public StringBuilder sb = new StringBuilder();         }

        private static byte[] SendBuf = new byte[] { };         ///         /// 接收的字节         ///         private static List RevBuf;         ///         /// 当前发送数据的客户端         ///         private static IPEndPoint _CurrentClient;         private static IPEndPoint CurrentClient         {             get { return _CurrentClient; }             set { _CurrentClient = value; }         }

        ///         /// 触发接收消息的委托         ///         private static bool _RevBool = false;         private static event EventHandler RevBoolChanged = null;         private static bool RevBool         {             get { return _RevBool; }             set             {                 if (_RevBool != value)                 {                     _RevBool = value;                     if (_RevBool)                     {                         RevBoolChanged?.Invoke(0, EventArgs.Empty);                     }                 }             }         }         ///         /// 存储客户端连接Socket         ///         private static Dictionary clientConnectionItems = new Dictionary { };         private static List ipstring = new List();//定义客户端ip集合,用于向所有客户端发送消息         private static Socket ServerClient;         private static IPEndPoint ServerPoint = null;         ///         /// 打开服务器         ///         ///         public static bool OpenServer()         {

            IPAddress IP = IPAddress.Parse(ip);             ServerPoint = new IPEndPoint(IP, int.Parse(port));             try             {                 ServerClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建套接字                 ServerClient.Bind(ServerPoint);//绑定IP及端口                 ServerClient.Listen(20);//设置监听数量                 ServerClient.BeginAccept(new AsyncCallback(AcceptCallback), ServerClient);//异步回调的方式接收连接请求                 return true;             }             catch (Exception ex)             {                 return false;             }         }         ///         /// 连接回调         ///         ///         private static void AcceptCallback(IAsyncResult ar)         {             try             {                 Socket listener = ar.AsyncState as Socket;                 if (listener != null)                 {                     Socket handler = listener.EndAccept(ar);//BeginAccept对应EndAccept                     StateObject state = new StateObject();                     state.workSocket = handler;                     IPEndPoint clientipe = (IPEndPoint)handler.RemoteEndPoint;                     clientConnectionItems.Add(clientipe.ToString(), handler);                     ipstring.Add(clientipe.ToString());                     handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(RevCallback), state);//异步回调接收每个客户端的消息                     listener.BeginAccept(new AsyncCallback(AcceptCallback), listener);//监听回调                 }             }             catch (Exception ex)             {             }         }         ///         /// 接收回调         ///         ///         private static void RevCallback(IAsyncResult ar)         {             StateObject state = (StateObject)ar.AsyncState;             //Socket socketClient= ar.AsyncState as Socket;             Socket handler = state.workSocket;             if (handler != null)             {                 IPEndPoint clientipe = (IPEndPoint)handler.RemoteEndPoint;                 try                 {                     // 从套接字读取数据                     int bytesRead = handler.EndReceive(ar);                     if (bytesRead > 0)                     {                         byte[] clinedata = new byte[bytesRead];                         RevBuf = new List();                         Buffer.BlockCopy(state.buffer, 0, clinedata, 0, bytesRead);                         RevBuf.AddRange(clinedata);

                        byte[] codebyte = new byte[bytesRead - 10];                         System.Array.Copy(clinedata, 10, codebyte, 0, bytesRead - 10);

                        //这里数据处理                         CurrentClient = clientipe;                         handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(RevCallback), state);//继续监听                         RevBool = true;                         RevBool = false;                     }                     else                     {                         clientConnectionItems.Remove(clientipe.ToString());//断开连接移除集合中数据                         ipstring.Remove(clientipe.ToString());                         handler.Close();                     }                 }                 catch (Exception ex)                 {                     clientConnectionItems.Remove(clientipe.ToString());                     ipstring.Remove(clientipe.ToString());                     handler.Close();                 }             }

        }         ///         /// 发送回复客户端         ///         /// 十六进制字符串         public static void Send(string hexstr)         {             string iplist = null;             try             {                 if (ServerClient != null)                 {                     SendBuf = DataTypeConverter.HexStringToByteArray(hexstr);                     //ServerClient.BeginSend(data, 0, data.Length, 0, new AsyncCallback(SendCallback), ServerClient);                     if (SendBuf.Length != 0)//确保发送的字节长度不为0                     {                         for (int i = 0; i < clientConnectionItems.Count; i++)                         {                             iplist += ipstring[i];                             clientConnectionItems[ipstring[i]].BeginSend(SendBuf, 0, SendBuf.Length, 0, new AsyncCallback(SendCallback), clientConnectionItems[ipstring[i]]);                         }                                            }

                }             }             catch (Exception e)             {             }

            // Convert the string data to byte data using ASCII encoding.                        // Begin sending the data to the remote device.

        }         ///         /// 发送回调         ///         ///         private static void SendCallback(IAsyncResult ar)         {             try             {

                Socket handler = (Socket)ar.AsyncState;                 int bytesSent = handler.EndSend(ar);                 //handler.Shutdown(SocketShutdown.Both);                 //handler.Close();             }             catch (Exception e)             {             }         }         #endregion  



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3