void client_OnServerConnected(object sender, SocketLib.TcpServerConnectedEventArgs e) { SocketMsgData.SocketMsgBase baseMsg = new SocketMsgData.SocketMsgBase(); baseMsg.LinkType = "1"; baseMsg.MsgType = SocketMsgData.TcpMsgDataType.ClientToken; baseMsg.Sender = schoolNum; baseMsg.SubSystem = SocketMsgData.TcpSeatManageSubSystem.SocketClient; client.Send(SeatManage.SeatManageComm.ByteSerializer.ObjectToByte(baseMsg)); }
void heartbeatTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { heartbeatTimer.Stop(); SocketMsgData.SocketMsgBase heardMsg = new SocketMsgData.SocketMsgBase(); heardMsg.MsgType = SocketMsgData.TcpMsgDataType.Heartbeat; heardMsg.Sender = ClientNo; byte[] b = SeatManage.SeatManageComm.ByteSerializer.ObjectToByte(heardMsg); try { heartbeatcount++; Send(b); Console.WriteLine("发送心跳包..."); if (heartbeatcount >= 1000) { heartbeatcount = 0; Disconnect(); this.connected = false; if (OnServerDisconnected != null) { OnServerDisconnected(this, new TcpServerDisconnectedEventArgs(this.addressList, this.port)); SeatManage.SeatManageComm.WriteLog.Write("发送心跳包出现异常,触发断开事件"); } } } catch (Exception ex) { //if (OnServerDisconnected != null) //{ // OnServerDisconnected(this, new TcpServerDisconnectedEventArgs(this.addressList, this.port)); //} //Connect(); this.connected = false; if (OnServerDisconnected != null) { OnServerDisconnected(this, new TcpServerDisconnectedEventArgs(this.addressList, this.port)); SeatManage.SeatManageComm.WriteLog.Write("发送心跳包出现异常,触发断开事件"); } else { SeatManage.SeatManageComm.WriteLog.Write("发送心跳包出现异常,断开事件为null"); } } finally { heartbeatTimer.Start(); } }
/// <summary> /// 接收到请求消息 /// </summary> /// <param name="msg"></param> void server_OnReceivedMsg(SocketMsgData.SocketMsgBase msg) { switch (msg.MsgType) { case SocketMsgData.TcpMsgDataType.Relay: if (msg is SocketMsgData.SocketRequest) { string m = string.Format("客户端{0}向学校{1}发送{2}请求", msg.Sender, msg.Target, msg.MethodName); writeLog(m); } else if (msg is SocketMsgData.SocketResponse) { string m = string.Format("学校{0}响应{1}客户端{2}的请求", msg.Sender, msg.Target, msg.MethodName); writeLog(m); } break; case SocketMsgData.TcpMsgDataType.WeiXinNotice: writeLog(string.Format("来自{0}的微信通知", msg.Sender)); break; } }
private void ProcessReceive(SocketAsyncEventArgs e) { try { string uid = ((MySocketAsyncEventArgs)e).UID;//用户Id if (e.LastOperation != SocketAsyncOperation.Receive) { return; } if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success) { Int32 byteTransferred = e.BytesTransferred; byte[] received = new byte[byteTransferred]; Buffer.BlockCopy(e.Buffer, e.Offset, received, 0, byteTransferred); List <byte[]> msg = null; //检查消息的准确性 lock (this.OnlineUID) { try { msg = this.readWritePool.busypool[uid].MsgHandler.GetActualObject(received); } catch (Exception ex) { SeatManage.SeatManageComm.WriteLog.Write(string.Format("根据消息头长度截取消息时遇到异常:{0}", ex.Message)); return; } } foreach (byte[] m in msg) { SocketMsgData.SocketMsgBase smb = null; try { smb = SeatManage.SeatManageComm.ByteSerializer.DeserializeByte <SocketMsgData.SocketMsgBase>(m); } catch (Exception ex) { SeatManage.SeatManageComm.WriteLog.Write(string.Format("消息反序列化失败:{0}", ex.Message)); return; } if (smb != null && smb.MsgType == SocketMsgData.TcpMsgDataType.Heartbeat) { if (this.readWritePool.BusyPoolContains(uid)) { this.readWritePool.busypool[uid].UserOnLineCounter = 0; } else { SocketAsyncEventArgsWithId readEventArgsWithId = null; lock (this.readWritePool) { readEventArgsWithId = this.readWritePool.Pop(uid); } readEventArgsWithId.ReceiveSAEA.UserToken = e.AcceptSocket; readEventArgsWithId.SendSAEA.UserToken = e.AcceptSocket; Interlocked.Increment(ref this.numConnections); lock (this.readWritePool) { if (OnClientConnected != null) { //连接事件 OnClientConnected(this, new TcpClientConnectedEventArgs(uid)); } } } //else //{ // this.readWritePool.Pop(uid); // if (OnMsgReceived != null) // { // smb.MsgType = SocketMsgData.TcpMsgDataType.ClientToken; // OnMsgReceived(((MySocketAsyncEventArgs)e).UID, smb); // } //} Console.WriteLine("接收到{0}的心跳包", ((MySocketAsyncEventArgs)e).UID); } else if (OnMsgReceived != null) { OnMsgReceived(((MySocketAsyncEventArgs)e).UID, smb); } } //可以在这里设一个停顿来实现间隔时间段监听,这里的停顿是单个用户间的监听间隔 //发送一个异步接受请求,并获取请求是否为成功 Boolean willRaiseEvent = (e.UserToken as Socket).ReceiveAsync(e); if (!willRaiseEvent) { ProcessReceive(e); } } else { this.CloseClientSocket(((MySocketAsyncEventArgs)e).UID); } } catch (Exception ex) { SeatManage.SeatManageComm.WriteLog.Write(string.Format("Socket服务处理接收到的消息遇到异常:{0}", ex.Message)); } }