/// <summary> /// 发送报文 /// </summary> /// <param name="value"></param> public void Write(byte[] value) { //如果socket为null,就 if (this.conn == null) { //自己把自己赋值进关闭进程 this.closeProcess(this, "调用已经断开的连接"); } else { if (value == null && DebugMessage.Notice != null) { DebugMessage.Notice((object)"编码出待发送的值为null"); } //加入到发送队列中 this.writeQueue.Add(value); //如果正在写,就返回 if (this.isWriting) { return; } this.isWriting = true; //调用写 this.OnWrite(); } }
/// <summary> /// 处理接收 /// </summary> /// <param name="e"></param> public void ProcessReceive(SocketAsyncEventArgs e) { //从socket中提取用户模型 UserToken userToken = e.UserToken as UserToken; //输入接受到的字节输大于零,并且socket标识为接收成功 if (userToken.receiveSAEA.BytesTransferred > 0 && userToken.receiveSAEA.SocketError == SocketError.Success) { //提取传输出来的字节数组 byte[] buff = new byte[userToken.receiveSAEA.BytesTransferred]; //copy缓冲区到新建的字节数组 Buffer.BlockCopy((Array)userToken.receiveSAEA.Buffer, 0, (Array)buff, 0, userToken.receiveSAEA.BytesTransferred); //把数组置入用户模型中 userToken.Receive(buff); this.StartReceive(userToken); } //客户端断开连接处理 else if ((uint)userToken.receiveSAEA.SocketError > 0U) { if (DebugMessage.Notice != null) { DebugMessage.Notice((object)("网络消息接收异常:用户退出+" + e.SocketError.ToString())); } this.ClientClose(userToken, userToken.receiveSAEA.SocketError.ToString()); } else { this.ClientClose(userToken, "客户端主动断开连接"); } }
/// <summary> /// 处理发送,赋值到UserToken /// </summary> /// <param name="e"></param> public void ProcessSend(SocketAsyncEventArgs e) { UserToken userToken = e.UserToken as UserToken; //客户端断开连接 if ((uint)e.SocketError > 0U) { if (DebugMessage.Notice != null) { DebugMessage.Notice((object)("网络消息发送异常:用户退出+" + e.SocketError.ToString())); } this.ClientClose(userToken, e.SocketError.ToString()); } else { userToken.Writed(); } }
/// <summary> /// 正在发送的数据包 /// </summary> public void OnWrite() { try { lock (this.sendSAEA) { if (this.writeQueue.Count == 0) { //取消正在写标识 this.isWriting = false; } else { //取出队列中最前面的消息 byte[] write = this.writeQueue[0]; this.writeQueue.RemoveAt(0); //如果write队列是空 if (write == null) { if (DebugMessage.Notice != null) { DebugMessage.Notice((object)"解析出待发送的值为null"); } this.isWriting = false; //递归 this.OnWrite(); } else { //设置数据缓冲 this.sendSAEA.SetBuffer(write, 0, write.Length); //发送异步,先发送拆出来的一部分出去 bool flag = this.conn.SendAsync(this.sendSAEA); //如果处于挂起状态直接返回 if (flag) { return; } //不处于挂起就发送进程 this.sendProcess(this.sendSAEA); Console.Write("是否挂起:" + flag.ToString()); } } } } catch (InvalidOperationException ex) { if (DebugMessage.Error == null) { return; } DebugMessage.Error((object)ex.Message); } catch (Exception ex) { if (DebugMessage.Error == null) { return; } DebugMessage.Error((object)ex.Message); } }