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



我在Java中的套接字上遇到了一个非常奇怪的问题。这可能是由于我对套接字缺乏了解而导致的,但这里是:

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

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发送消息时,似乎需要很长时间才能通过第一条消息。当它最终通过时,一切似乎都工作正常。所有后续消息将立即处理。这只是我在连接并加入该频道后发送的第一条消息,需要很长时间。

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

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

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

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

如果需要更多信息,我将尝试提供它,因为这看起来可能很复杂。

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

这意味着您最终会多次发送这些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"的消息,它也会触发。 您应该将每个传入消息分解为源、命令、目标和参数。

相关内容

最新更新