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

Java socket output has delayed first message

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

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

1
2
3
4
5
6
7
8
9
10
11
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发送消息时,在第一条消息通过之前似乎需要很长时间。当一切都结束的时候,一切似乎都很顺利。立即处理所有以下消息。这只是我在连接并加入该频道后发送的第一条消息,需要很长时间。

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

1
2
3
4
public void sendToServer(String input) {
        getOutput().println(input);
        getOutput().flush();
    }

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

如果值得一提的话:我正在为我的servlets使用tomcat6,在这个servlets上我建立了连接,而作为irc服务器使用了一个未实现的tomcat6。消息通过Ajax发送到servlet。(但发送到服务器的过程似乎很顺利,因为发送消息时所执行的系统输出会立即打印在Tomcat日志中,因此延迟在套接字或IRC服务器中。)

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


每次执行while循环时,您的代码似乎都会发送JOIN命令,对于服务器发送给您的每一行,该命令似乎都是一次,直到您最终收到服务器的响应,确认您已加入该通道为止。

这意味着您最终将发送这些JOIN命令的次数非常多。IRCD的设计目的是只处理来自每个客户机的每秒命令的设置速率,所以这可能是您的滞后(您的后一个命令最终出现在一个非常长的队列的末尾,队列中充满了大量的JOIN命令)。

相反,您应该只发送一次JOIN命令,在发送时设置标志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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消息解析方法。如果我给你发一条包含"加入:Prinz"的信息,它也会触发。您应该将每个传入消息分解为源、命令、目标和参数。