我试图创建一个带有“服务器”和客户端的简单聊天程序,现在我的问题是程序在从服务器读取消息到客户端时阻塞,反之亦然。此示例突出了从客户端到服务器的消息问题。
我在服务器端拥有的示例:
private Reader input;
private Writer output;
try {
server = new ServerSocket(this.port);
while (true) {
Socket connection = server.accept();
serverDisplay("We have a connection");
input = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
output = new BufferedWriter(new OutputStreamWriter(
connection.getOutputStream()));
int c;
StringBuffer sb = new StringBuffer();
// This is where it blocks, the input stream should return -1 at the end of the
// stream and break the loop, but it doesnt
while ((c = input.read()) != -1) {
sb.append((char) c);
}
serverDisplay(sb.toString());
}
} catch (IOException e) {
System.out.println("IO ex in the server");
}
为了在客户端发送消息,我有以下代码:
output = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
和
private void sendMessage(String message) {
displayMessage(message);
try {
output.write(message);
output.flush();
} catch (IOException e) {
System.out.println("IO ex at sendMessage client");
}
}
它读取我发送的所有字符(从客户端到服务器;通过 Sys out 确认)但是当它应该读取流的结尾(-1)时它挂在那里。
我试图在while循环中打印“c”以查看它返回的值,它根本不会进入循环,也不会破坏它,它只是挂在那里。
我知道已经有一些与这个主题相关的问题,但我还没有在其中找到解决我的问题的方法。
奇怪的是(至少对我来说),如果我使用:
output = new ObjectOutputStream(connection.getOutputStream());
input = new ObjectInputStream(connection.getInputStream());
和:
while ((message = (String) input.readObject()) != null)
代替:
input = new BufferedReader(new InputStreamReader(connection.getInputStream()));
output = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream()));
和:
while ((c = input.read()) != -1)
洞的东西有效。然而,这不是我想要的方式,通过阅读 BufferedReader/Writer、Input/OutputStreamWriter 的 API,我认为我的代码应该可以工作。
先感谢您。