【发布时间】:2021-03-23 22:54:57
【问题描述】:
我试图通过套接字实现一个基本的聊天应用程序,但我遇到了 ObjectInputStream 的问题。我在 while(true) 循环中使用了两种写读方法,当没有任何东西可以读取并无限等待它时,编译过程卡住了。因此,我需要在阅读之前检查它是否为空。
这是我的代码。
服务器:
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);
}
【问题讨论】:
-
不确定所有上下文,但您总是可以:ois.readObject().toString().isEmpty()
-
您可能需要检查
available()是否对您有用。 -
由于没有要读取的对象,它等待检查 ois.ReadObject().toString().isEmpty()。我无法确定是否存在字符串,因为 available() 返回字节的整数值。几乎所有情况下它都返回 0。
-
@tugraturkseven 如果确实有可以读取的对象,
available()的返回值会大于0吗? -
@Progman 因为它基于字符串,不幸的是没有。