为服务器套接字响应创建监听器?

时间:2011-08-21 17:51:13

标签: java android sockets networking

我有一个服务器 - 客户端对,我想在客户端创建一个侦听器来获取新的服务器响应。我不知道该怎么做,现在我只能以直接同步的方式进行交互。

这是服务器:

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 个答案:

答案 0 :(得分:1)

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

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