2013-12-18 52 views
0

的情况: - 客户端1:在那里他们连接到服务器的用户名用户端应用程序。连接将保持活动状态,等待来自服务器的消息。套接字连接到服务器,并等待消息,同时继续检查连接状态

客户端2:事件发射应用,要求服务器相连的所有用户,并关闭其连接。它将处理用户列表并选择一个用户。它将连接回服务器并要求它向选定的用户发送消息。

服务器:监听客户端1在11111和客户端2上22222.连接与客户端1,直到用户在客户端1软件登出来维持生命。客户端2需求列表,选择一个元素,要求服务器将消息中继到客户端1的实例。如果client1在那段时间内关闭,则服务器响应false,client2返回到获取client1的活动实例列表的步骤。

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

准确地说,我面临着2个线程,一个要保持连接,重新连接,如果去了,而另一个继续寻找InputStream中的数据访问相同的Socket实例的一个问题。如果KeepAlive线程检查连接并且同时MessageReader线程将接收数据,那么系统会崩溃。

回答

0

我通常会使用客户端上的读取超时来启动服务器查询,然后返回阅读。如果发生另一个读取超时,则客户端知道其服务器无法访问,关闭它的套接字并退到尝试重新打开连接(例如每隔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); 
}; 

只需要一个线程 - 你不需要轮询服务器是否正在接收数据 - 的连接必须确定。

相关问题