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

时间:2011-05-22 12:40:17

标签: java sockets irc

我在Java中使用套接字时遇到了一个非常奇怪的问题。它可能是因为我对套接字缺乏了解而引起的,但现在是:

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

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

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

在这个方法结束时,我调用了getOutput()。flush();

现在,当我试图通过我正在写的客户端向IRCserver发送消息时,似乎需要很长时间才能通过第一条消息。当它终于通过一切似乎工作正常。以下所有消息都会立即处理。这只是我连接后发送的第一条消息,并且已加入该通道需要很长时间。

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您的代码似乎每次在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数字表示,因此您可能需要在发送之前等待该行。< / p>

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