コード例 #1
0
ファイル: Client.cs プロジェクト: webconfig/Card
    private void OnReceive(IAsyncResult result)
    {
        try
        {
            int bytesReceived = this.socket.EndReceive(result);
            if (bytesReceived == 0)
            {
                this.State = ConnectionState.Disconnected;
                return;
            }
            //拷贝到缓存队列
            for (int i = 0; i < bytesReceived; i++)
            {
                AllDatas.Add(buffer[i]);
            }
            //===解析数据===
            int len = 0, command = 0;
            do
            {
                if (AllDatas.Count > 7)                       //最小的包应该有8个字节
                {
                    NetHelp.BytesToInt(AllDatas, 0, ref len); //读取消息体的长度
                    len += 4;
                    //读取消息体内容
                    if (len <= AllDatas.Count)
                    {
                        NetHelp.BytesToInt(AllDatas, 4, ref command);//操作命令
                        byte[] msgBytes = new byte[len - 8];
                        AllDatas.CopyTo(8, msgBytes, 0, msgBytes.Length);
                        AllDatas.RemoveRange(0, len);
                        Handlers.Handle(this, command, msgBytes);
                    }
                    else
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
            } while (true);

            this.BeginReceive();
        }
        catch (SocketException ex)
        {
            Debug.LogException(ex);
        }
        catch (Exception ex)
        {
            Debug.LogException(ex);
        }
    }
コード例 #2
0
ファイル: BaseClient.cs プロジェクト: webconfig/Card
        /// <summary>
        ///接收完成时处理函数
        /// </summary>
        /// <param name="e">与接收完成操作相关联的SocketAsyncEventArg对象</param>
        private void ProcessReceive()
        {
            // 检查远程主机是否关闭连接
            if (asyn.BytesTransferred > 0)
            {
                if (asyn.SocketError == SocketError.Success)
                {
                    //判断所有需接收的数据是否已经完成
                    if (socket.Available == 0)
                    {
                        //获取接收到的数据
                        //byte[] ByteArray = new byte[asyn.BytesTransferred];
                        //Array.Copy(asyn.Buffer, 0, ByteArray, 0, ByteArray.Length);

                        //拷贝到缓存队列
                        for (int i = 0; i < asyn.BytesTransferred; i++)
                        {
                            AllDatas.Add(asyn.Buffer[i]);
                        }
                        //===解析数据===
                        int len = 0, command = 0;
                        do
                        {
                            if (AllDatas.Count > 7)                       //最小的包应该有8个字节
                            {
                                NetHelp.BytesToInt(AllDatas, 0, ref len); //读取消息体的长度
                                len += 4;
                                //读取消息体内容
                                if (len <= AllDatas.Count)
                                {
                                    NetHelp.BytesToInt(AllDatas, 4, ref command);//操作命令
                                    byte[] msgBytes = new byte[len - 8];
                                    AllDatas.CopyTo(8, msgBytes, 0, msgBytes.Length);
                                    AllDatas.RemoveRange(0, len);
                                    Handle(this, command, msgBytes);
                                }
                                else
                                {
                                    break;
                                }
                            }
                            else
                            {
                                break;
                            }
                        } while (true);
                    }
                    else if (!socket.ReceiveAsync(asyn))    //为接收下一段数据,投递接收请求,这个函数有可能同步完成,这时返回false,并且不会引发SocketAsyncEventArgs.Completed事件
                    {
                        // 同步接收时处理接收完成事件
                        this.ProcessReceive();
                    }
                }
                else
                {
                    this.ProcessError();
                }
            }
            else
            {
                CloseSocket(this);
            }
        }