Java-readObject()和setSoTimeout()函数
因此,我在客户端编写了一个线程,它试图从套接字流Java-readObject()和setSoTimeout()函数,java,sockets,socket-timeout-exception,Java,Sockets,Socket Timeout Exception,因此,我在客户端编写了一个线程,它试图从套接字流readObject() 只要客户端连接,此线程就一直运行 可以在客户端GUI上关闭与服务器的连接。 如果客户端决定断开连接(这不会退出客户端程序),请单击 “disconnect”(断开)菜单选项,插座将关闭,且已断开连接设置为false 由于客户端读取线程试图从流中读取readObject(),而连接可以通过GUI关闭,因此我将超时设置为250ms(setSoTimeout(250)) } 我知道readObject()会阻塞,为了检查客户端是
readObject()
只要客户端连接,此线程就一直运行
可以在客户端GUI上关闭与服务器的连接。
如果客户端决定断开连接(这不会退出客户端程序),请单击
“disconnect”(断开)菜单选项,插座将关闭,且已断开连接
设置为false
由于客户端读取线程试图从流中读取readObject()
,而连接可以通过GUI关闭,因此我将超时设置为250ms(setSoTimeout(250)
)
}
我知道readObject()
会阻塞,为了检查客户端是否仍然连接,我将其包装在while
中,它会检查(每个超时)客户端套接字是否仍然连接
我现在的问题是:
在这种情况下,如果readObject()
开始获取服务器传递的对象,尝试读取它,但在处理超时时,流上的数据是否会以某种方式“损坏”,因为它已被取消。
或者,如果GUI线程想要关闭套接字,我应该让readObject()
阻塞并捕获异常
我对套接字不是很有经验,可能我的方法是错误的。套接字读取超时将导致
SocketTimeoutException
被readObject()
抛出。您可能无法重用该ObjectInputStream
,并且该流可能会被损坏,因为它的当前位置基本上没有定义
这可能只能通过关闭并重新打开连接来解决。isConnected()如果对等方已断开连接,则不会返回false。您必须捕获并处理EOFEException。是的,您是对的。在
catch(…){}
我必须捕获一系列异常。EOFEException
catch将调用forceDisconnect()
关闭客户端的资源,并为用户调整GUI元素。
@Override
public void run()
{
this.connection = this.connectionHandler.getSocket();
while(connectionHandler.isConnected())
{
this.readCircle();
}
this.connectionHandler.setReadTaskRunning(false);
}
private void readCircle()
{
try
{
this.connection.setSoTimeout(250);
this.connectionHandler.readData(); //this uses readObject().
}
catch(SocketTimeoutException timeout){}
catch(...){}