我想在从流中读取之前检查服务器是否仍然连接到客户端。如何在java中做到这一点?我目前的代码如下。这只检查客户端套接字吗?
public void receiveResultFromServer() {
try {
while(!clientSocket.isClosed()) {
try{
Object obj = inStream.readObject();
if (obj instanceof Command) {
ConnectionManager.parseCommand((Command) obj);
} else if (obj instanceof CommandExecResult) {
ConnectionManager.parseCommandExecutionResult((CommandExecResult) obj);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
} catch(Exception e) {
e.printStackTrace();
}
答案 0 :(得分:1)
在阅读流之前了解连接性并不好。而是设计一个心跳机制。
算法:
a)使用enum" SEND_BEAT"设计两个命令和" RECEIVE_BEAT"在客户端和服务器上。
b)现在,一旦您的服务器启动,启动一个线程,使用命令从服务器向客户端发送信号(握手协议),客户端将响应信号到服务器
c)此发送信号作业可以定期安排,使用Java Timer和TimerTask类,例如。
scheduleAtFixedRate(new RunTimer(), 5000, 1000);
d)在响应的基础上,维护客户端在服务器上的状态。
e)现在您可以使用status来检查客户端和服务器之间的连接。
f)事实上,您甚至可以设计一种重新连接机制,在最终更新之前会尝试一定次数。
h)您还需要根据需要将状态维持为检查点。
希望以上算法满足您的需求。
答案 1 :(得分:0)
如果对等方已断开连接,则代码将抛出EOFException
。如果网络出现故障,它可能会永远阻塞,因此您可能需要考虑使用读取超时,这将导致SocketTimeoutException
。