Java 套接字输出延迟了第一条消息

标签 java sockets irc

我在 Java 中的套接字方面遇到了一个非常奇怪的问题。这可能是因为我缺乏对套接字的了解,但它是:

我正在使用套接字连接到 IRC 服务器。连接完美,我收到了 IRC 服务器发送给我的所有消息。 建立连接后,我向服务器进行身份验证,并启动一个单独的线程来接收服务器发送给我的内容。在该线程中,我在连接时发送一条消息,以使程序加入某个 channel 。

boolean joined = false;
        while ((line = getInput().readLine()) != null) {
            if (!joined) {
                getOutput().println("JOIN #Random");
                getOutput().println("JOIN #Modnar");

                if (line.contains("JOIN :#Random")) {
                    joined = true;
                    System.out.println("JOINED #Random= true");
                }
            }

在此方法的最后,我调用 getOutput().flush();

现在,当我尝试通过我正在编写的客户端向 IRCserver 发送消息时,似乎需要很长时间才能收到第一条消息。当它最终完成时,一切似乎都进展顺利。所有后续消息都会立即处理。只是我在连接并加入该 channel 后发送的第一条消息需要很长时间。

我用来向服务器发送消息的方法非常简单:

public void sendToServer(String input) {
        getOutput().println(input);
        getOutput().flush();
    }

是否有人知道为什么第一条消息需要这么长时间才能传输到服务器,而接下来的所有消息(在第一条消息最终到达之后)却进展顺利?

如果值得一提的话:我使用 Tomcat6 作为我的 servlet,在其上进行连接,并使用 UnrealIRCd 作为 IRC 服务器。消息通过 AJAX 发送到 servlet。 (但是发送到服务器似乎进展顺利,因为发送消息时我正在执行的 System.out 会立即打印在我的 Tomcat 日志中,因此延迟位于套接字或 IRC 服务器中。 )

如果需要更多信息,我会尽力提供,因为这可能看起来很复杂......

最佳答案

您的代码似乎每次绕过 while 循环时都会发送 JOIN 命令,这似乎是服务器向您发送的每一行发送一次,直到您最终收到服务器确认的响应您已加入该 channel 。

这意味着您最终将多次发送这些 JOIN 命令。 IRCD 的设计目的是仅处理来自每个客户端的每秒命令的设定速率 - 因此这可能是您落后的原因(您后面的命令最终会出现在一个充满大量 JOIN 的很长队列的末尾)命令)。

相反,您应该仅发送 JOIN 命令一次,并在发送后立即设置标志:

boolean sent_join = false;
boolean joined = false;

while ((line = getInput().readLine()) != null) {
    if (!sent_join) {
        getOutput().println("JOIN #PrinZ");
        getOutput().println("JOIN #Trinorae");
        sent_join = true;
    }

    if (line.contains("JOIN :#prinz")) {
        System.out.println("JOINED #prinz = true");
        joined = true;
    }
}

请注意,您必须在注册后才能发送 JOIN 命令(由 001 数字表示),因此您可能需要等待发送之前先行。

请注意,line.contains 并不是一种非常可靠的解析 IRC 消息的方法。如果我向您发送一条包含“JOIN :#prinz”的消息,它也会触发该消息。您应该将每条传入消息分解为源、命令、目标和参数。

关于Java 套接字输出延迟了第一条消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6087991/

相关文章:

java - 访问我的自定义 View ( inflated layout )中的组件?

Python套接字未从C++ Boost asio接收所有数据

java - 换行 IRC 协议(protocol)

node.js - 如何在我的 IRC 机器人上实现反垃圾邮件技术?

java - hibernate : An association from the table application_category refers to an unmapped class: allin. beans1.Application

java - 是否可以使用 DaisyDiff 保留输入标记?

java - Fragment prev 已弃用 如何更改此代码 Android studio

node.js - Node : Distinguish between a reload event and a browser exit with socket event

sockets - netcat 如何从两个不同的终端监听同一主机上的同一端口?

python |如何限制 IRC 机器人中的命令?