这是对一个问题的跟进:。基本上,我有一个服务器循环来管理与一个客户端的连接。在循环的某个点上,如果存在一个ClientSocket,则尝试进行读取以检查客户端是否仍然连接:
问题在于,一旦创建了套接字,应用程序将在读取时挂起,我认为是等待永远不会到来的数据,因为客户端从未发送到服务器。 以前这没问题,因为这样正确地处理了断开连接(当客户端断开连接时,读取最终会失败),循环将尝试重新建立连接。 然而,现在我已经添加了上面的sendHeartBeat()方法,它定期让客户端知道服务器仍然在运行。 如果读取正在占用线程,则心跳永远不会发生!
因此,我认为我正在错误地测试连接是否仍然存在。 作为快速修补措施,我可以在单独的线程中运行bufferedReader.read(),但是那样我将遇到各种并发问题,我真的不想处理。
所以问题有几个方面: 1. 我是否正确检查客户端断开连接? 2. 如果不是,我该怎么做? 3. 如果我正在正确执行操作,如何使读取不再托管进程? 或者线程是唯一的方法吗?
if (bufferedReader.read() == -1) {
logger.info("CONNECTION TERMINATED!");
clientSocket.close();
setUpSocket(); // sets up the server to reconnect to the client
} else {
sendHeartBeat(); // Send a heartbeat to the client
}
问题在于,一旦创建了套接字,应用程序将在读取时挂起,我认为是等待永远不会到来的数据,因为客户端从未发送到服务器。 以前这没问题,因为这样正确地处理了断开连接(当客户端断开连接时,读取最终会失败),循环将尝试重新建立连接。 然而,现在我已经添加了上面的sendHeartBeat()方法,它定期让客户端知道服务器仍然在运行。 如果读取正在占用线程,则心跳永远不会发生!
因此,我认为我正在错误地测试连接是否仍然存在。 作为快速修补措施,我可以在单独的线程中运行bufferedReader.read(),但是那样我将遇到各种并发问题,我真的不想处理。
所以问题有几个方面: 1. 我是否正确检查客户端断开连接? 2. 如果不是,我该怎么做? 3. 如果我正在正确执行操作,如何使读取不再托管进程? 或者线程是唯一的方法吗?