服务器不解码数据包
Server not decoding packets
我正在为我的项目设计一个通信系统。但是,我在处理数据包时遇到了一些麻烦。我的通信系统是用 java.net 使用 ServerSocket、Socket、BufferedReader 和 PrintWriter 编写的。
目前,我的系统每 500 毫秒侦听一次数据包。它可以很好地处理登录数据包,但无法处理 post-登录数据包(发送 ID、断开连接)。每隔 500 毫秒,我需要我的服务器监听登录和 post-登录数据包(发送 ID、断开连接)。我将如何设计一种方法来检测和处理 post-login 数据包?登录包由握手码、用户名和密码组成。 Post-登录包(打印id,断开)由握手码,用户id,事件id等事件参数组成。
使用 bufferedreader 和 printwriter 将数据包作为一行文本发送和接收。
这是我的服务器端解码器
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();
}
}
这些是我的客户端 -> 服务器数据包
public void sendLogin() {
write.write("100");
write.write('\n');
write.write("raees2");
write.write('\n');
write.write("LOL2");
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");
write.write('\n');
write.write(Integer.toString(id));
write.write('\n');
write.write(Integer.toString(0));
write.write('\n');
write.write(Integer.toString(10003));
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");
write.write('\n');
write.write(Integer.toString(id));
write.write('\n');
write.write(Integer.toString(1));
write.write('\n');
write.flush();
}
基本上,您只需要一个循环来继续从流中读取数据,直到对话结束。现在,它读取一条消息并终止。
我不确定你的协议是如何工作的,但这样的东西可以作为一个起点:
protected void decode(Socket server) throws Exception {
final BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
/*
* Somewhere in this loop, detect your protocol's termination condition
* and break out.
*/
for (;;) {
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);
}
}
}
如果您需要同时处理多个连接,您可能希望接受器线程为每个成功连接的连接启动一个新的客户端线程,因为 decode
会在等待下一个连接时阻塞消息。
我正在为我的项目设计一个通信系统。但是,我在处理数据包时遇到了一些麻烦。我的通信系统是用 java.net 使用 ServerSocket、Socket、BufferedReader 和 PrintWriter 编写的。
目前,我的系统每 500 毫秒侦听一次数据包。它可以很好地处理登录数据包,但无法处理 post-登录数据包(发送 ID、断开连接)。每隔 500 毫秒,我需要我的服务器监听登录和 post-登录数据包(发送 ID、断开连接)。我将如何设计一种方法来检测和处理 post-login 数据包?登录包由握手码、用户名和密码组成。 Post-登录包(打印id,断开)由握手码,用户id,事件id等事件参数组成。
使用 bufferedreader 和 printwriter 将数据包作为一行文本发送和接收。
这是我的服务器端解码器
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();
}
}
这些是我的客户端 -> 服务器数据包
public void sendLogin() {
write.write("100");
write.write('\n');
write.write("raees2");
write.write('\n');
write.write("LOL2");
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");
write.write('\n');
write.write(Integer.toString(id));
write.write('\n');
write.write(Integer.toString(0));
write.write('\n');
write.write(Integer.toString(10003));
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");
write.write('\n');
write.write(Integer.toString(id));
write.write('\n');
write.write(Integer.toString(1));
write.write('\n');
write.flush();
}
基本上,您只需要一个循环来继续从流中读取数据,直到对话结束。现在,它读取一条消息并终止。
我不确定你的协议是如何工作的,但这样的东西可以作为一个起点:
protected void decode(Socket server) throws Exception {
final BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));
/*
* Somewhere in this loop, detect your protocol's termination condition
* and break out.
*/
for (;;) {
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);
}
}
}
如果您需要同时处理多个连接,您可能希望接受器线程为每个成功连接的连接启动一个新的客户端线程,因为 decode
会在等待下一个连接时阻塞消息。