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

标签 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 应用程序。

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

最佳答案

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

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

关于java - 为服务器套接字响应创建监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7139996/

相关文章:

c - 接收/接收的最大镜头数是多少

java - 向模型添加验证后出现 Spring Boot 异常

javascript - JSP 表单使用 post 传递值

java - 如何通过管道将 OutputStream 和 InputStream 传输到控制台?

Java、Oracle db - trunc(nvl) 从日期时间对象中删除时间戳后出现时区问题

sockets - 如何证明Jetty 9 SelectChannelConnector超时有效?

android - 迁移到 New Places SDK 时遇到的问题

android - java.lang.IllegalArgumentException : We already have an EditText, 只能有一个

java - 如何在 Android 中使用 JSON 引擎

c - 发送 UDP 数据包时,如何取回系统分配的传出端口? (BSD C 套接字)