@Override public void run() { while (listening) { Packet packet = null; try { packet = socket.receive(); } catch (InterruptedException e) { e.printStackTrace(); continue; } Message message = new Gson().fromJson(new String(packet.getData()), Message.class); String packetData = new String(packet.getData()); switch (message.getType()) { case NickChangeMessage.TYPE: NickChangeMessage nickChangeMessage = new Gson().fromJson(packetData, NickChangeMessage.class); state.addUser(nickChangeMessage, packet.getSourceAddress()); break; case TextMessage.TYPE: TextMessage textMessage = new Gson().fromJson(packetData, TextMessage.class); state.receiveMessage(textMessage, packet.getSourceAddress()); break; case LeaveMessage.TYPE: LeaveMessage leaveMessage = new Gson().fromJson(packetData, LeaveMessage.class); state.userLeft(leaveMessage); break; case InviteMessage.TYPE: InviteMessage inviteMessage = new Gson().fromJson(packetData, InviteMessage.class); state.invite(inviteMessage); break; case RequestNickMessage.TYPE: RequestNickMessage requestNickMessage = new Gson().fromJson(packetData, RequestNickMessage.class); state.requestNick(requestNickMessage, packet.getSourceAddress()); break; case LeaveConversationMessage.TYPE: LeaveConversationMessage leaveConversationMessage = new Gson().fromJson(packetData, LeaveConversationMessage.class); state.leaveConversation(leaveConversationMessage); break; } } }