【问题标题】:sockets to connect to server and wait for messages while simultaneously keep checking connection state连接到服务器并等待消息的套接字,同时继续检查连接状态
【发布时间】:2013-12-18 19:10:43
【问题描述】:

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

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

服务器:在 11111 上侦听 client1 和在 22222 上侦听 client2。与 client1 的连接将保持活动状态,直到用户在 client1 软件中注销。 client2 请求列表,选择一个元素,要求服务器将消息中继到 client1 的该实例。如果此时 client1 已关闭,则服务器会以 false 响应,并且 client2 会返回获取 client1 的活动实例列表的步骤。

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

准确地说,我在通过 2 个线程访问同一个套接字实例时遇到问题,一个线程保持连接活动并在出现故障时重新连接,另一个线程继续在输入流中查找数据。如果 KeepAlive 线程检查连接,同时 MessageReader 线程正在接收数据,那么系统将崩溃。

【问题讨论】:

    标签: java multithreading sockets client-server keep-alive


    【解决方案1】:

    我通常做的是在客户端使用读取超时来启动服务器轮询,然后返回读取。如果发生另一个读取超时,客户端知道它的服务器不可达,关闭它的套接字并回退到尝试每隔 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);
    };
    

    只需要一个线程 - 如果正在接收数据,您不需要轮询服务器 - 连接必须正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多