我可以将Java的BufferedReader与事件监听器一起使用而不是while(true)吗?

时间:2011-11-04 15:30:32

标签: java bufferedreader event-listener

我正在编写Java客户端和服务器,他们正在正确地相互交谈。但是,此时,客户端必须始终在收到消息之前向服务器发送消息 - 但我希望服务器能够在客户端没有要求的情况下发送消息。

在我的主要语言AS3中,我已经向套接字添加了一个事件监听器并以这种方式处理数据 - 但我似乎无法找到如何在Java中这样做。

目前我的客户端中包含以下代码:

public String send(String message) {
    out.println(message);
    try {
        return in.readLine();
    } catch (IOException ex) {
        return "";
    }
}

基本上我打电话给它,传递我的消息,它返回给我服务器的响应。 而不是这样做,我想在那里发送一条消息,如下所示,并在不同的地方(通过事件监听器)获取响应。

public void send(String message) {
    out.println(message);
}

由于我无法弄清楚事件监听器如何工作,我确实考虑使用一个单独的线程来运行while(true){in.readLine;}但我想尽可能避免这种情况;我对线程并不太舒服,我希望尽可能简单。

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用线程。我至少有一个线程读取套接字,允许服务器随时向客户端发送消息。

混合响应和事件的问题是你的第一个块不起作用,因为“响应”可能是一个事件。

如果您不想使用线程,可以使用类似

的内容
// simple but probably not a good idea.
public String send(String message) {
    out.println(message);
    try {
        while(true) {
            String line = in.readLine();
            if (isEvent(line))
               processEvent(line);
            else
               return line;
    } catch (IOException ex) {
        return "";
    }
}

但是,它只会在发送请求时读取事件,并且如果不定期执行此操作,则可能导致流一直存储到服务器,导致它也被阻塞。