示例#1
0
        async public Task StartAsync()
        {
            NetworkStream stream;
            IPacket       received;

            byte[] receiveHeader, receiveData, decompressData;
            int    nbytes, receiveDataLength;

            // 클라이언트에서 오는 메세지를 듣기 위해 별도의 쓰레드를 돌린다.
            await Task.Factory.StartNew(async() =>
            {
                while (this.client.Connected)
                {
                    try
                    {
                        stream = this.client.GetStream();

                        // 1. 결과의 헤더를 받는다.
                        receiveHeader = new byte[Consts.SIZE_HEADER];
                        nbytes        = await stream.ReadAsync(buffer: receiveHeader, offset: 0, count: receiveHeader.Length);

                        // 2. 결과의 데이터를 받는다.
                        receiveDataLength = BitConverter.ToInt32(value: receiveHeader, startIndex: 0);
                        receiveData       = await TcpUtil.ReceiveDataAsync(networkStream: stream, dataLength: receiveDataLength);

                        await stream.FlushAsync();

                        // 3. 결과는 압축되어 있으므로 푼다.
                        decompressData = await NetUtil.DecompressAsync(data: receiveData);
                        received       = NetUtil.DeserializeObject(data: decompressData) as IPacket;

                        await Receive(this.stageID, received);
                    }
                    catch (SocketException)
                    {
                        await Disconnect(this.stageID, this.userID);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex);
                        await Disconnect(this.stageID, this.userID);
                    }
                }
            });
        }