/// <summary> /// 发送数据到所有连入的客户端 /// </summary> /// <param name="data"></param> private void SendToClientByName(ClientWrapper client, byte[] data, string UserName) { try { if (client == null) { WriteLog("SendToClientByName", "ClientWrapper的client为空!"); } } catch (Exception ex) { WriteLog("SendToClientByName", ex); } if (client.Socket.Connected) { try { // 如果某客户端 Socket 是连接状态,则向其发送数据 client.Socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendToClientComplete), client); } catch (SocketException ex) { HandleException(client, ex); } } else { // 某 Socket 断开了连接的话则将其关闭,并将其清除出客户端 Socket 列表 // 也就是说每次向所有客户端发送消息的时候,都会从客户端 Socket 集合中清除掉已经关闭了连接的 Socket try { client.Socket.Close(); lvClient.Items.Remove(dicCilents[UserName]); dicCilents.Remove(UserName); lstClients.Remove(client); lsrv.LoginOut(UserName); WriteLog(string.Format("客户端{0}关闭了连接正常退出!", client.UserName)); } catch (Exception e) { WriteLog("SendToClientByName=== client.Socket.Close&lsrv.LoginOut", e); } } }
/// <summary> /// 发送数据到所有连入的客户端 /// </summary> /// <param name="data">需要发送的数据</param> private void SendToClientByName(ClientWrapper client, string data, string UserName) { try { WriteLog(UserName); byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); SendToClientByName(client, byteData, UserName); } catch (Exception ex) { clearClients(client); WriteLog("SendToClientByName", ex); } }
/// <summary> /// 客户端连接完成的回调函数 /// </summary> /// <param name="async"></param> private void ClientConnectComplete(IAsyncResult async) { ClientWrapper client = new ClientWrapper(); try { // 完成接受客户端传入的连接的这个异步操作,并返回客户端连入的 socket client.Socket = sktServer.EndAccept(async); // 将客户端连入的 Socket 放进客户端 Socket 列表 lstClients.Add(client); } catch (Exception ex) { WriteLog("ClientConnectComplete===client.Socket", ex); } try { // 开始接收客户端传入的数据 client.Socket.BeginReceive(client.Buffer, 0, client.Buffer.Length, SocketFlags.None, new AsyncCallback(ClientReceiveComplete), client); } catch (SocketException ex) { HandleException(client, ex); } try { sktServer.BeginAccept(new AsyncCallback(ClientConnectComplete), null);//继续接受下一个连接(关键!否则只能监听到第一个连接) } catch (SocketException ex) { HandleException(client, ex); } }
/// <summary> /// 处理 SocketException 异常 /// </summary> /// <param name="client">导致异常的 ClientSocketPacket</param> /// <param name="ex">SocketException</param> private void HandleException(ClientWrapper client, SocketException ex) { try { // 在服务端记录异常信息,关闭导致异常的 Socket,并将其清除出客户端 Socket 列表 //OutPut("异常:" + client.Socket.RemoteEndPoint.ToString() + " - " + ex.Message); client.Socket.Close(); lsrv.LoginOut(client.UserName); WriteLog(string.Format("客户端{0}异常退出!", client.UserName)); clearClients(client); } catch (Exception e) { WriteLog("HandleException", e); } }
private void clearClients(ClientWrapper client) { if (lvClient.Items.Contains(dicCilents[client.UserName])) { lvClient.Items.Remove(dicCilents[client.UserName]); } if (dicCilents.ContainsKey(client.UserName)) { dicCilents.Remove(client.UserName); } if (lstClients.Contains(client)) { lstClients.Remove(client); } }