public void Handle() { var endPoint = (IPEndPoint)Socket.RemoteEndPoint; try { do { DataPackage package = DataPackage.FromStream(_networkStream); Debug.WriteLine($"Client [{endPoint.Address}:{endPoint.Port}] message type: {package.Type.ToString()}"); switch (package.Type) { case MessageType.CLIENT_LOGIN: OnLogin(package.Data); break; case MessageType.CLIENT_LOGOUT: OnLogout(); break; case MessageType.CLIENT_MESSAGE: OnMessageReceived(package.Data); break; case MessageType.CLIENT_IMAGE_MESSAGE: OnImageMessageReceived(package.Data); break; case MessageType.CLIENT_JOIN_ROOM: OnJoinRoom(package.Data); break; case MessageType.CLIENT_LIST_JOINED_ROOMS: OnListJoinedRooms(); break; case MessageType.CLIENT_LEAVE_ROOM: OnLeaveRoom(package.Data); break; case MessageType.CLIENT_DISCONNECT: _closed = true; break; case MessageType.CLIENT_PUSH_FILE: OnClientPushFile(package.Data); break; case MessageType.CLIENT_PULL_FILE: OnClientPullFile(package.Data); break; } } while (!_closed); } catch (SocketException ex) { Debug.WriteLine($"Client {endPoint.Address}:{endPoint.Port} : {ex.Message}"); } catch (EndOfStreamException ex) { Debug.WriteLine($"Client {endPoint.Address}:{endPoint.Port} : {ex.Message}"); } catch (IOException ex) { if (ex.InnerException is SocketException) { Debug.WriteLine($"Client {endPoint.Address}:{endPoint.Port} : {ex.Message}"); } else { throw; } } finally { Close(); } }
private Task Receiver(NetworkStream stream, CancellationTokenSource cts) { return(new Task(() => { Trace.TraceInformation("Receiver task starting..."); //stream.ReadTimeout = 5000; try { while (true) { if (cts.Token.IsCancellationRequested) { break; } DataPackage dataPackage = DataPackage.FromStream(stream); switch (dataPackage.Type) { case MessageType.SYSTEM_LOGIN_OK: { LoginInfo info = Serializer.Deserialize <LoginInfo>(dataPackage.Data); Name = info.Name; LoginOK?.Invoke(this, info); } break; case MessageType.SYSTEM_LOGIN_FAILED: { LoginInfo info = Serializer.Deserialize <LoginInfo>(dataPackage.Data); LoginFailed?.Invoke(this, info); } break; case MessageType.SYSTEM_JOIN_ROOM_OK: { RoomInfo roomInfo = Serializer.Deserialize <RoomInfo>(dataPackage.Data); JoinedInRoom?.Invoke(this, roomInfo); } break; case MessageType.SYSTEM_LEAVE_ROOM_OK: { RoomInfo roomInfo = Serializer.Deserialize <RoomInfo>(dataPackage.Data); LeavedFromRoom?.Invoke(this, roomInfo); } break; case MessageType.CLIENT_MESSAGE: { Message message = Serializer.Deserialize <Message>(dataPackage.Data); MessageReceived?.Invoke(this, message); } break; case MessageType.CLIENT_IMAGE_MESSAGE: { var imageMessage = Serializer.Deserialize <ImageMessage>(dataPackage.Data); ImageMessageReceived?.Invoke(this, imageMessage); } break; case MessageType.CLIENT_FILE_MESSAGE: { var fileMessage = Serializer.Deserialize <FileMessage>(dataPackage.Data); FileMessageReived?.Invoke(this, fileMessage); } break; case MessageType.SYSTEM_FILE_TRANSFER: { var fileMessage = Serializer.Deserialize <FileMessage>(dataPackage.Data); FileReived?.Invoke(this, fileMessage); } break; case MessageType.SYSTEM_MESSAGE_OK: { Receipt receipt = Serializer.Deserialize <Receipt>(dataPackage.Data); MessageArrivied?.Invoke(this, receipt); } break; case MessageType.SYSTEM_MESSAGE: { var message = Encoding.UTF8.GetString(dataPackage.Data); SystemMessageReceived?.Invoke(this, message); break; } case MessageType.CLIENT_LOGOUT: { Name = null; LogoutOK?.Invoke(this, null); goto default; } default: UnknownMessageReceived?.Invoke(this, new SystemMessageEventArgs(dataPackage.Type, dataPackage.Data)); break; } } } catch (EndOfStreamException ex) { Debug.WriteLine($"Client {Name} Receiver: {ex.Message}"); } catch (IOException ex) { if (ex.InnerException is SocketException) { SocketExceptionRaising?.Invoke(this, (SocketException)ex.InnerException); } else { Trace.TraceInformation($"{ex}"); } } ReceiverTaskExited?.Invoke(this, null); Trace.TraceInformation("Receiver task exited"); }, TaskCreationOptions.LongRunning)); }