Java 套接字连接到服务器并等待消息,同时保持检查连接状态

Java 套接字连接到服务器并等待消息,同时保持检查连接状态,java,multithreading,sockets,client-server,keep-alive,Java,Multithreading,Sockets,Client Server,Keep Alive,情况:- client1:用户端应用程序,在这里他们使用用户名连接到服务器。连接将保持活动状态,客户端1将等待来自服务器的消息 client2:事件触发的应用程序,向服务器请求所有已连接的用户并关闭其连接。它将处理用户列表并选择一个用户。它将连接回服务器,并要求它向所选用户发送消息 服务器:监听11111上的client1和2222上的client2。在用户注销client1软件之前,与client1的连接将保持活动状态。client2请求列表,选择一个元素,要求服务器将消息中继到client1

情况:- client1:用户端应用程序,在这里他们使用用户名连接到服务器。连接将保持活动状态,客户端1将等待来自服务器的消息

client2:事件触发的应用程序,向服务器请求所有已连接的用户并关闭其连接。它将处理用户列表并选择一个用户。它将连接回服务器,并要求它向所选用户发送消息

服务器:监听11111上的client1和2222上的client2。在用户注销client1软件之前,与client1的连接将保持活动状态。client2请求列表,选择一个元素,要求服务器将消息中继到client1的那个实例。若此时client1已关闭,服务器将以false响应,client2将返回到获取client1的活动实例列表的步骤

我面临的问题是:- 如何在client1中实现系统,以便在用户操作连接UI元素时连接到服务器,然后使连接始终处于活动状态,万一连接中断,它将自行重新连接。同时,它应该轮询inputstream以接收服务器连接时可能发送的任何消息


确切地说,我正面临一个问题,即通过两个线程访问同一个套接字实例,一个线程保持连接活动并在发生故障时重新连接,另一个线程保持在inputstream中查找数据。如果KeepAlive线程检查连接,同时MessageReader线程将接收数据,那么系统将崩溃。

我通常在客户端使用读取超时来启动服务器轮询,然后返回读取。如果发生另一次读取超时,则客户端知道其服务器无法访问,关闭其套接字并返回尝试每隔(比如)10秒重新打开连接。伪C:

boolean pollOustanding;

while true{
  if connectAttempt(){
    pollOutstanding:=false;
    while(true){
       if readWithTimeout(2000){
          handleReceivedData(); // could be 'real' data, or poll reply from server
          pollOutstanding:=false;
       }
       else
         { if (pollOutstanding) break;
           pollOutstanding=true;
           sendPoll();
         };
    };
    closeSocket;
  };
  Sleep(10000);
};
只需要一个线程-如果接收到数据,不需要轮询服务器-连接必须正常