【发布时间】:2018-08-24 09:14:29
【问题描述】:
我的程序上有一个侦听器线程,它正在等待来自服务器的输入。因此,他收到一条消息,将其放入队列中,然后等待另一个消息。因为这个事实,在其他类似主题中提出的方式上不能关闭它,因为他需要在测试While条件之前从服务器接收消息。
这里是:
public class Listener implements Runnable{
private Socket socket;
private ObjectInputStream ois;
public Listener(Socket socket) {
this.socket = socket;
try {
this.ois = new ObjectInputStream(socket.getInputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
try {
while(!socket.isClosed()) {
String type = ois.readUTF();
System.out.println("received: " +type);
main.queue.put(type);
}
} catch (IOException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
所以基本上,当我关闭套接字时,ois.readUTF 将抛出 EOFException。 我该怎么做才能正确停止此流而不会出现此异常?
我发现的唯一方法是,当客户端想要停止连接(并关闭套接字)时,他可以向服务器发送消息(如“再见”或其他),然后服务器会回答“再见”,当我的听众收到这个再见时,他将关闭套接字,这将使他退出 while 循环并停止。我认为它应该运作良好。但我想知道是否有其他方法可以做到这一点(不知何故,我对我的想法不太满意)。
【问题讨论】:
-
中断线程和/或关闭连接。
-
你读过这篇文章吗?问题正是如何做到这一点,知道 ois.read 在获得输入之前一直处于阻塞状态。所以关闭连接只会让他抛出 EOFException。
-
这正是它应该做的。然后它将不再阻塞读取。我读了你的帖子,但你显然不明白我给你的帮助。
-
问题是“我可以做些什么来正确地停止这个流没有得到这个异常?”。以为很清楚。
-
但你只是认为这很糟糕,因为有一个例外。我告诉你,这样做是完全正常的。您说的是“正确”,这意味着这不是正确的方法。我告诉你,你错了。
标签: java multithreading sockets