コード例 #1
0
 public void ClientReceiveData(IAsyncResult ar)
 {
     try
     {
         Socket socket = (Socket)ar.AsyncState;
         int    count  = socket.EndReceive(ar);
         if (count <= 0)
         {
             Clear();
             return;
         }
         package.WriteIndex += count;
         ProcessData();
         if (package.Remain < 8)
         {
             package.MoveBytes();
             package.Resize(package.Length * 2);
         }
         socket.BeginReceive(package.Bytes, package.WriteIndex, package.Remain, 0, ClientReceiveData, socket);
     }
     catch (SocketException e)
     {
         DetailLog.Error("ClientReceiveError:" + e.Message);
         Clear();
     }
 }
コード例 #2
0
        private void ProcessData()
        {
            if (package.Length <= 4 || package.ReadIndex < 0)
            {
                return;
            }
            int dataLength = BitConverter.ToInt32(package.Bytes, package.ReadIndex);

            if (package.Length < dataLength + 4)
            {
                return;
            }
            package.ReadIndex += 4;
            try
            {
                T data = NetTool.Deserialize <T>(package.Bytes, package.ReadIndex, dataLength);
                OnReceiveData(data);
            }
            catch (Exception e)
            {
                DetailLog.Error("ProcessDataError:" + e.Message);
                return;
            }
            package.ReadIndex += dataLength;
            package.CheckAndMoveBytes();

            if (package.Length > 4)
            {
                ProcessData();
            }
        }
コード例 #3
0
 internal void SendData(byte[] data)
 {
     try
     {
         clientSocket.BeginSend(data, 0, data.Length, 0, null, null);
     }
     catch (Exception e)
     {
         DetailLog.Error("SendMessageError:" + e.Message);
     }
 }
コード例 #4
0
 private void ServerConnectCallBack(IAsyncResult ar)
 {
     try
     {
         socket.EndConnect(ar);
         clientSession = new T();
         clientSession.ReceiveData(socket, null);
     }
     catch (Exception e)
     {
         DetailLog.Error("ConnectServer:" + e.Message);
     }
 }
コード例 #5
0
 public void StartClient(IPEndPoint ipEndPoint)
 {
     DetailLog.InitSettings();
     try
     {
         socket.BeginConnect(ipEndPoint, ServerConnectCallBack, socket);
         DetailLog.ColorLog(LogColor.Blue, "Client Start Success!\nConnecting To Server......");
     }
     catch (Exception e)
     {
         DetailLog.Error("StartClient:" + e.Message);
     }
 }
コード例 #6
0
        public void StartServer(IPEndPoint ipEndPoint)
        {
            DetailLog.InitSettings();
            try
            {
                socket.Bind(ipEndPoint);
                socket.Listen(50000);
                DetailLog.ColorLog(LogColor.Blue, "Server Start Success!\nWaiting for Connecting......");
                while (true)
                {
                    ResetCheckRead();
                    try
                    {
                        //检查当前Socket,返回可读Socket数组
                        Socket.Select(checkReadList, null, null, 5000);
                    }
                    catch (SocketException e)
                    {
                        DetailLog.Error("StartReceiveError:" + e.Message);
                    }

                    for (int i = checkReadList.Count - 1; i >= 0; i--)
                    {
                        Socket s = checkReadList[i];
                        if (s == socket)
                        {
                            //监听Socket可读,有新的客户端连接到服务器
                            Socket client        = socket.Accept();
                            T      clientSession = new T();
                            clientSession.InitNetSession(client, () =>
                            {
                                if (clientSocketDic.ContainsKey(client))
                                {
                                    clientSocketDic.Remove(client);
                                }
                            }, false);
                            clientSocketDic.Add(client, clientSession);
                        }
                        else
                        {
                            //连接客户端的Socket可读,客户端向服务端发送消息
                            clientSocketDic[s].ServerReceiveData();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                DetailLog.Error("StartServerError:" + e.Message);
            }
        }
コード例 #7
0
        private void SendCallBack(IAsyncResult ar)
        {
            NetworkStream ns = (NetworkStream)ar.AsyncState;

            try
            {
                ns.EndWrite(ar);
                ns.Flush();
                ns.Close();
            }
            catch (Exception e)
            {
                DetailLog.Error("SndMsgError:" + e.Message);
            }
        }
コード例 #8
0
 public void StartServer(IPEndPoint ipEndPoint)
 {
     DetailLog.InitSettings();
     try
     {
         socket.Bind(ipEndPoint);
         socket.Listen(50000);
         socket.BeginAccept(ClientConnectCallBack, socket);
         DetailLog.ColorLog(LogColor.Blue, "Server Start Success!\nWaiting for Connecting......");
     }
     catch (Exception e)
     {
         DetailLog.Error("StartServer:" + e.Message);
     }
 }
コード例 #9
0
 internal static T Deserialize <T>(byte[] data) where T : NetData
 {
     using (MemoryStream ms = new MemoryStream(Decompession(data)))
     {
         try
         {
             T result = Serializer.NonGeneric.Deserialize(typeof(T), ms) as T;
             return(result);
         }
         catch (SerializationException e)
         {
             DetailLog.Error("Failed to deserialize. Log: " + e.Message);
             return(null);
         }
     }
 }
コード例 #10
0
        private void ReceiveHeadData(IAsyncResult ar)
        {
            try
            {
                NetPackage mPackage = (NetPackage)ar.AsyncState;
                if (clientSocket.Available == 0)
                {
                    Clear();
                    return;
                }

                int len = clientSocket.EndReceive(ar);
                if (len > 0)
                {
                    mPackage.HeadIndex += len;
                    if (mPackage.HeadIndex < mPackage.HeadLength)
                    {
                        clientSocket.BeginReceive(
                            mPackage.HeadBuffer,
                            mPackage.HeadIndex,
                            mPackage.HeadLength - mPackage.HeadIndex,
                            SocketFlags.None,
                            ReceiveHeadData,
                            mPackage);
                    }
                    else
                    {
                        mPackage.InitBodyBuffer();
                        clientSocket.BeginReceive(mPackage.BodyBuffer,
                                                  0,
                                                  mPackage.BodyLength,
                                                  SocketFlags.None,
                                                  ReceiveBodyData,
                                                  mPackage);
                    }
                }
                else
                {
                    Clear();
                }
            }
            catch (Exception e)
            {
                DetailLog.Error("RcvHeadError:" + e.Message);
            }
        }
コード例 #11
0
        internal void SendData(byte[] data)
        {
            NetworkStream ns = null;

            try
            {
                ns = new NetworkStream(clientSocket);
                if (ns.CanWrite)
                {
                    ns.BeginWrite(data, 0, data.Length, new AsyncCallback(SendCallBack), ns);
                }
            }
            catch (Exception e)
            {
                DetailLog.Error("SndMsgError:" + e.Message);
            }
        }
コード例 #12
0
 internal static byte[] Serialize <T>(T data) where T : NetData
 {
     using (MemoryStream ms = new MemoryStream())
     {
         try
         {
             Serializer.Serialize(ms, data);
             ms.Seek(0, SeekOrigin.Begin);
             return(Compession(ms.ToArray()));
         }
         catch (SerializationException e)
         {
             DetailLog.Error("Failed to serialize. Log: " + e.Message);
             return(null);
         }
     }
 }
コード例 #13
0
 internal static T Deserialize <T>(byte[] data, int offset, int count) where T : NetData
 {
     byte[] realData = new byte[count];
     Array.Copy(data, offset, realData, 0, count);
     using (MemoryStream ms = new MemoryStream(Decompession(realData)))
     {
         try
         {
             T result = Serializer.NonGeneric.Deserialize(typeof(T), ms) as T;
             return(result);
         }
         catch (SerializationException e)
         {
             DetailLog.Error("Failed to deserialize. Log: " + e.Message);
             return(null);
         }
     }
 }
コード例 #14
0
        private void ReceiveBodyData(IAsyncResult ar)
        {
            try
            {
                NetPackage mPackage = (NetPackage)ar.AsyncState;
                int        len      = clientSocket.EndReceive(ar);
                if (len > 0)
                {
                    mPackage.BodyIndex += len;
                    if (mPackage.BodyIndex < mPackage.BodyLength)
                    {
                        clientSocket.BeginReceive(mPackage.BodyBuffer,
                                                  mPackage.BodyIndex,
                                                  mPackage.BodyLength - mPackage.BodyIndex,
                                                  SocketFlags.None,
                                                  ReceiveBodyData,
                                                  mPackage);
                    }
                    else
                    {
                        //处理数据
                        T data = NetTool.Deserialize <T>(mPackage.BodyBuffer);
                        OnReceiveData(data);

                        mPackage.RestPackage();
                        clientSocket.BeginReceive(
                            mPackage.HeadBuffer,
                            0,
                            mPackage.HeadLength,
                            SocketFlags.None,
                            ReceiveHeadData,
                            mPackage);
                    }
                }
                else
                {
                    Clear();
                }
            }
            catch (Exception e)
            {
                DetailLog.Error("RcvBodyError:" + e.Message);
            }
        }
コード例 #15
0
 private void ClientConnectCallBack(IAsyncResult ar)
 {
     try
     {
         Socket clientSocket = socket.EndAccept(ar);
         T      session      = new T();
         clientSessionList.Add(session);
         session.ReceiveData(clientSocket, () =>
         {
             if (clientSessionList.Contains(session))
             {
                 clientSessionList.Remove(session);
             }
         });
     }
     catch (Exception e)
     {
         DetailLog.Error("ConnectClient:" + e.Message);
     }
     socket.BeginAccept(ClientConnectCallBack, socket);
 }
コード例 #16
0
        public void ReceiveData(Socket socket, Action closeCB)
        {
            OnConnected();
            try
            {
                clientSocket  = socket;
                closeCallBack = closeCB;
                NetPackage mPackage = new NetPackage();

                this.clientSocket.BeginReceive(
                    mPackage.HeadBuffer,
                    0,
                    mPackage.HeadLength,
                    SocketFlags.None,
                    new AsyncCallback(ReceiveHeadData),
                    mPackage);
            }
            catch (Exception e)
            {
                DetailLog.Error("StartRcvData:" + e.Message);
            }
        }
コード例 #17
0
        public void ServerReceiveData()
        {
            int count = 0;

            if (package.Remain <= 0)
            {
                ProcessData();
                package.CheckAndMoveBytes();
                while (package.Remain <= 0)
                {
                    int expandSize = package.Length < NetPackage.DEFAULT_SIZE
                        ? NetPackage.DEFAULT_SIZE
                        : package.Length;
                    package.Resize(expandSize * 2);
                }
            }
            try
            {
                count = clientSocket.Receive(package.Bytes, package.WriteIndex, package.Remain, 0);
            }
            catch (SocketException e)
            {
                DetailLog.Error("ServerReceiveError:" + e.Message);
                Clear();
                return;
            }

            if (count <= 0)
            {
                Clear();
                return;
            }
            //根据协议内容处理消息,处理结果返回客户端
            package.WriteIndex += count;
            ProcessData();
            package.CheckAndMoveBytes();
        }