コード例 #1
0
 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();
     }
 }
コード例 #3
0
        /// <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;
            }
        }
コード例 #4
0
        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));
            }
        }