我在使用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中。 )
如果需要更多的信息,我会尽量提供它,因为这可能看起来很复杂这样的..
如果将flush()移入while循环会发生什么? – MeBigFatGuy 2011-05-22 12:46:18
在while循环中实际上有一个刷新。但是flush是最后的,因为我还做了一些XML解析(将XML发送到客户端)以及两者之间的ping回复。 – StefK 2011-05-22 18:30:32
使用Wireshark监控流量并确定问题是发送延迟还是服务器响应延迟。 – 2011-05-23 02:18:40