I'm designing a communications system for my project. However, I'm having some trouble handling packets. My communications system is written in java.net using ServerSocket, Socket, BufferedReader, and PrintWriter.
Currently, my system listens for packets every 500ms. It handles the login packet fine but it fails to handle the post-login packets. Every 500ms, I need my server to handle login and post-login packets. How would I design a method that would detect and process post-login packets? The login packet consists of the handshake code, username, and password. Post-login packets consist of the handshake code, user id, event id and other event parameters.
This is my server sided decoder
Code:
protected void decode(Socket server) throws Exception {
final BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
final int handshake = Integer.parseInt(reader.readLine());
if (handshake == LOGIN) {
final Session session = new LoginSession(server, reader);
session.read(-1);
} else if (handshake == POST_LOGIN) {
final int index = Integer.parseInt(reader.readLine());
final int opcode = Integer.parseInt(reader.readLine());
final Session session = store.get(index).getSession();
session.reader = reader;
session.read(opcode);
}
}
@Override
public void run() {
Socket server;
try {
server = serverSocket.accept();
server.setTcpNoDelay(false);
decode(server);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
These are my incoming packets from the client to the server
Code:
public void sendLogin() {
write.write("100");//login handshake
write.write('\n');
write.write("raees2");//username
write.write('\n');
write.write("LOL2");//password
write.write('\n');
write.flush();
}
public void sendPrintId() throws NumberFormatException, IOException {
final BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
final int id = Integer.parseInt(reader.readLine());
System.out.println(id);
write.write("101");//post login handshake
write.write('\n');
write.write(Integer.toString(id));//user id
write.write('\n');
write.write(Integer.toString(0));//event id
write.write('\n');
write.write(Integer.toString(10003));//event parameter
write.write('\n');
write.flush();
}
public void sendDisconnection() throws NumberFormatException, IOException {
final BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
final int id = Integer.parseInt(reader.readLine());
System.out.println(id);
write.write("101");//post-login handshake
write.write('\n');
write.write(Integer.toString(id));//user id
write.write('\n');
write.write(Integer.toString(1));//event id
write.write('\n');
write.flush();
}