Java 套接字连接到服务器并等待消息,同时保持检查连接状态
情况:- client1:用户端应用程序,在这里他们使用用户名连接到服务器。连接将保持活动状态,客户端1将等待来自服务器的消息 client2:事件触发的应用程序,向服务器请求所有已连接的用户并关闭其连接。它将处理用户列表并选择一个用户。它将连接回服务器,并要求它向所选用户发送消息 服务器:监听11111上的client1和2222上的client2。在用户注销client1软件之前,与client1的连接将保持活动状态。client2请求列表,选择一个元素,要求服务器将消息中继到client1的那个实例。若此时client1已关闭,服务器将以false响应,client2将返回到获取client1的活动实例列表的步骤 我面临的问题是:- 如何在client1中实现系统,以便在用户操作连接UI元素时连接到服务器,然后使连接始终处于活动状态,万一连接中断,它将自行重新连接。同时,它应该轮询inputstream以接收服务器连接时可能发送的任何消息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
确切地说,我正面临一个问题,即通过两个线程访问同一个套接字实例,一个线程保持连接活动并在发生故障时重新连接,另一个线程保持在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);
};
只需要一个线程-如果接收到数据,不需要轮询服务器-连接必须正常