C#异步TCP通讯服务端 |
您所在的位置:网站首页 › TCP端口扫描代码 › C#异步TCP通讯服务端 |
#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 |