/// <summary> /// 异步发送操作完成时调用此方法 /// 该方法在套接字上发出另一个接收以读取任何附加信息 /// 从客户端发送的数据 /// </summary> /// <param name="e"></param> private void ProcessSend(SocketAsyncEventArgs e) { if (e.SocketError == SocketError.Success) { AsyncUserToken token = e.UserToken as AsyncUserToken;// 获取客户端信息 try { // 读取从客户端发送的下一个数据块 bool willRaiseEvent = token.Socket.ReceiveAsync(e); if (!willRaiseEvent) { ProcessReceive(e);// 如果数据不为空就发送给客户端 } } catch (Exception ex) { log.AddLog(LogType.Error, $"在异步发送完成时出错!\r\n客户端地址:{token.IPAddress}\r\n错误信息:{ex.Message}"); } } else { CloseClientSocket(e); } }
/// <summary> /// 发送数据到指定对象 /// </summary> /// <param name="token">用户Token信息,以此来辨识用户</param> /// <param name="message">要发送的信息</param> internal void SendMessage(AsyncUserToken token, Byte[] message) { if (token == null || token.Socket == null || !token.Socket.Connected) { return; } try { Byte[] buff = new Byte[message.Length + 4]; // 简单协议发送 Byte[] len = BitConverter.GetBytes(message.Length); Array.Copy(len, buff, 4); Array.Copy(message, 0, buff, 4, message.Length); SocketAsyncEventArgs sendArgs = new SocketAsyncEventArgs { UserToken = token }; sendArgs.SetBuffer(message, 0, message.Length); // 数据放入缓冲池 token.Socket.SendAsync(sendArgs); // 发送数据 } catch (Exception ex) { log.AddLog(LogType.Error, $"发送数据到指定对象时出错!\r\n客户端地址:{token.IPAddress}\r\n错误信息:{ex.Message}"); } }