我正在尝试创建单线程echo-server,但我无法弄清楚如何从客户端再次从服务器向客户端发送输入。客户端连接到服务器正常,但它正在等待它抛出IOException的响应。我尝试将聊天客户端连接到其他聊天服务器,因此我确定错误在聊天服务器实现中。
我猜这个“恶棍”是下面介绍的方法,它从连接的客户端获取输入并将其发回,但我不确定为什么它不起作用。
private void processClientRequest(Socket clientSocket) throws IOException {
InputStream in = clientSocket.getInputStream();
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream());
long time = System.currentTimeMillis();
out.write("Server - " + time + ": " + in);
out.close();
in.close();
}
请告诉我这种方法不是问题,而是需要我代码的其他部分。 提前谢谢!
编辑:我现在设法让我的服务器响应客户端。我通过将processClientRequest方法更改为:
来完成此操作try {
BufferedReader in =
new BufferedReader(
new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream());
long time = System.currentTimeMillis();
out.write("Server - " + time + ": " + in.readLine());
out.close();
try {
in.close();
} catch (IOException e) {
System.err.println("Couldn't close input stream");
}
} catch(IOException e) {
System.err.println("Got an IOException error while reading or writing from/to client");
}
但截至目前,我的服务器只能回复客户端一次。如果客户端第二次写入服务器,它会收到响应,但不是客户端消息,而是“空”。而且由于我希望我的echo服务器能够接听客户端,直到客户端关闭或类似的东西,我需要弄清楚如何改变它。我想我将需要某种while循环来实现这一点,但我已经尝试过将整个try语句放入无限循环中,但这只是给了我大量的IOExceptions。
答案 0 :(得分:1)
您没有阅读客户输入。你只是将toString
传递给了你。你需要做一个while循环并从中读取。也许在一个单独的线程中除非你确定输入很短。在测试代码中应该没问题:
private void processClientRequest(Socket clientSocket) throws IOException {
InputStream in = clientSocket.getInputStream();//wrap this in a object stream or other to read lines/ utf
int i = 0;
while(i++ < 1000 && in.available() > 0){
int read = in.read();//use it if u want, like to a string builder declared out of loop and echo it back after u read input
}
PrintWriter out =
new PrintWriter(clientSocket.getOutputStream());
long time = System.currentTimeMillis();
out.write("Server - " + time + ": " + in);
out.close();//should be in seperate try catches so if 1 close fails u still close other and finally close socket in 3rd try catch
in.close();
}
Socket server带有工作回显服务器,迷你网络服务器,并且有很多方面的帮助。