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

我在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。 (但是发送到服务器似乎进行得很顺利,因为我发送消息时的System.out会立即打印在我的Tomcat日志中,所以延迟在IRC服务器的套接字OR中。 )

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


您的代码似乎在每次绕过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”的消息,它也会触发此消息。 你应该将每个传入的消息分解为源代码,命令,目的地和参数。

链接地址: http://www.djcxy.com/p/53455.html

上一篇: Java socket output has delayed first message

下一篇: "NOTICE AUTH" notifications when connecting to IRC server