Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-readObject()和setSoTimeout()函数_Java_Sockets_Socket Timeout Exception - Fatal编程技术网

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(...){}