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); } } }); }