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

标签 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;} 但我想避免这种情况,如果尽一切可能;我不太喜欢线程,我希望它尽可能简单。

最佳答案

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

混合响应和事件的问题是您的第一个 block 将无法工作,因为“响应”可能是一个事件。

如果你不想使用线程,你可以有类似的东西

// 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 "";
    }
}

但是,它只会在发送请求时读取事件,如果不定期这样做,它可能会导致流一直堆积到服务器,从而导致它也被阻塞。

关于java - 我可以将 Java 的 BufferedReader 与事件监听器而不是 while(true) 一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011733/

相关文章:

go - Golang Bufio WriteByte未写入

javascript - jQuery 插件事件监听器未触发或绑定(bind)

java - 来自 MessageDigest 的 Java 中的 md5 哈希不匹配

java - 如何使 JOptionPane.showConfirmDialog 默认没有选中?

java - 如何将此 unix 时间字符串转换为 java 日期

javascript - 在 JavaScript 中动态添加 EventListener

javascript - 事件监听器使用这个

java - 将 String 中的 byte[] 从 Java 发送到 C 程序

java - 套接字、BufferedReader.readline() - 为什么流没有准备好?

java - 套接字/Telnet 连接/BufferedReader