2011-08-21 87 views
1

我有一个服务器 - 客户端对,我想在客户端创建一个侦听器,以获得新的服务器响应。我不知道如何做到这一点,现在我只能以直接同步的方式进行交互。为服务器套接字响应创建监听器?

这里是服务器:

public class TestServer { 

public static void main(String[] args) throws Exception { 

    TestServer myServer = new TestServer(); 
    myServer.run(); 

} 

private void run() throws Exception { 

    ServerSocket mySS = new ServerSocket(4443);  

    while(true) { 

     Socket SS_accept = mySS.accept(); 

     BufferedReader myBR = new BufferedReader(new InputStreamReader(SS_accept.getInputStream())); 

     String temp = myBR.readLine(); 
     System.out.println(temp); 


     if (temp!=null) { 

      PrintStream serverPS = new PrintStream(SS_accept.getOutputStream()); 
      serverPS.println("Response received: " + temp); 

     } 

    } 
} 

}

正如你可以看到,它发送一个响应时,它得到一个。但是一般来说,我不确定何时使用其他服务器发送响应,所以我想创建一个异步监听器(或者至少每半秒钟轮询服务器以获取响应)。

这里是我想要在客户端:

protected static String getServerResponse() throws IOException { 

    String temp; 
    try { 
     BufferedReader clientBR = new BufferedReader(new InputStreamReader(mySocket.getInputStream())); 
     temp = clientBR.readLine(); 
    } catch (Exception e) { 
     temp = e.toString(); 
    } 

    return temp; 
} 

而且仅作参考,是的,从客户端发送了数据服务器(其正确的System.out的数据)工作正常。但是,当我调用上述函数来尝试并检索服务器响应时,它只是挂起我的应用程序,这是一个Android应用程序,以防相关。

我想从一个函数中得到的只是能够询问服务器是否有数据并获取它,如果没有,那么不要崩溃我该死的应用程序。

回答

1

在客户端创建一个ConnectionManager类,它将处理所有的套接字I/O。 ConnectionManagerconnect()方法将创建并启动一个将侦听服务器响应的新线程。一旦它收到回应,它将通知所有ConnectionManager的注册听众。因此,为了异步接收服务器响应,您必须使用其register(SomeListener)方法在ConnectionManager中注册侦听器。

此外,你可以看看JBoss Netty这是一个异步事件驱动的网络应用框架。它极大地简化并简化了TCP和UDP套接字服务器等网络编程。