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”的消息,它也会触发此消息。 你应该将每个传入的消息分解为源代码,命令,目的地和参数。
上一篇: Java socket output has delayed first message
下一篇: "NOTICE AUTH" notifications when connecting to IRC server