所以,我在我的客户端写了一个线程,它试图readObject()从套接字流.
该线程在客户端连接时运行.
可以在客户端的GUI上关闭与服务器的连接.如果客户端通过单击"断开连接"菜单选项决定断开连接(这不会退出客户端程序),则将关闭套接字并将a 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(...){}
Run Code Online (Sandbox Code Playgroud)
}
我知道readObject()会阻塞,并检查客户端是否仍然连接,我将其包装在一个中while,检查(每次超时)客户端套接字是否仍然连接.
我现在的问题是:
如果readObject()开始获取服务器传递的对象,尝试读取它,但在处理超时时,流上的数据会以某种方式被"损坏",因为它被取消了.或者我应该让readObject()块,并在GUI线程想要关闭套接字时捕获异常.
我对套接字不太熟悉,也许我的方法完全错了.
当我close()在客户端(FF)上建立 websocket 连接并调试服务器端以查看传入数据(将其转换为十六进制以读取数据)时,我收到类似“8880825d04de”(仍被屏蔽)的内容。每次接近尝试时,我都会收到类似的数据“8880XXXXXX”。
掩码应该是“825d04de”,因为它每次都会改变,并且 RFC 告诉我客户端的关闭消息被掩码了。8880 让我感到困惑,因为在 RFC 中,指示关闭消息的操作码是 0x8。
有人可以向我解释一下吗?