我试图通过套接字实现一个基本的聊天应用程序,但我有objectinputstream的问题。我在while(true)循环中同时使用write-read方法,而编译过程在没有可读取内容并无限期等待时陷入困境。因此,我需要检查它是空的还是不读之前。
这是我的密码。
服务器:
Socket socket = server.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Server connected!");
oos.flush();
String message = (String) ois.readObject();
System.out.println(ois.available());
txtChat.setText(message);
while(true) {
if(sendMessage) {
oos.writeObject(txtMessage.getText());
oos.flush();
sendMessage = false;
}
while(!sendMessage) {
message = (String) ois.readObject();
txtChat.setText(txtChat.getText()+"\n"+"Client: "+message);
}
Thread.sleep(100);
}
客户:
socket = new Socket(host.getHostName(), 9876);
oos = new ObjectOutputStream(socket.getOutputStream());
ois = new ObjectInputStream(socket.getInputStream());
oos.flush();
String message = (String) ois.readObject();
txtChat.setText(message);
while(true) {
message = (String) ois.readObject();
txtChat.setText(txtChat.getText()+"\n"+"Server: "+message);
if(sendMessage) {
oos.writeObject(txtMessage.getText());
oos.flush();
sendMessage = false;
}
Thread.sleep(100);
}
1条答案
按热度按时间xmakbtuz1#
流不是关闭就是打开。
在您从输入流中读取某些内容之前,它不会意识到它已关闭。这正是为什么不存在这样的问题
isClosed()
流上的方法。您可以将流中的字节读入对象。充其量只能构造对象。否则,您应该处理io异常并做出相应的决定。
或者,您可以检查在不阻塞的情况下可以读取多少字节。如果它是0,那么您看到的是一个等待输入的空流。