gpt4 book ai didi

Java - readObject() 和 setSoTimeout()

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:29:43 24 4
gpt4 key购买 nike

因此,我在客户端编写了一个线程,它尝试从套接字流中readObject()

只要客户端连接,该线程就会运行。

可以在客户端的 GUI 上关闭与服务器的连接。如果客户端决定断开连接(这不会退出客户端程序)通过点击“disconnect”菜单选项,套接字将关闭并且 isConnected 设置为 false。

由于客户端读取线程尝试从流中readObject(),而连接可以通过 GUI 关闭,我将超时设置为 250 毫秒 (setSoTimeout(250)).

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

我知道 readObject() 会阻塞,为了检查客户端是否仍然连接,我将它包装在 while 中,它检查(每次超时)是否客户端套接字仍处于连接状态。

我现在的问题:

如果 readObject() 开始获取服务器传递的对象,尝试读取它,但在处理时发生超时,流上的数据是否会“损坏”在某种程度上,因为它取消了。或者如果 GUI 线程想要关闭套接字,我应该让 readObject() 阻塞并捕获异常。

我对套接字不是很有经验,也许我的方法根本不对。

最佳答案

套接字读取超时将导致 SocketTimeoutExceptionreadObject() 抛出。您可能无法重用该 ObjectInputStream,并且该流可能会损坏,因为它的当前位置在很大程度上仍未定义。

这可能只能通过关闭并重新打开连接来解决。

关于Java - readObject() 和 setSoTimeout(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14999703/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com