【发布时间】:2022-02-04 19:27:08
【问题描述】:
Java 中的套接字有一个非常奇怪的问题。这可能是因为我对套接字缺乏了解,但这里是:
我正在使用套接字连接到 IRC 服务器。连接完美,我收到了 IRC 服务器发送给我的所有消息。 建立连接后,我对服务器进行身份验证并启动一个单独的线程来接收服务器发送给我的内容。在那个线程中,我在连接时发送一条消息以使程序加入某个频道。
boolean joined = false;
while ((line = getInput().readLine()) != null) {
if (!joined) {
getOutput().println("JOIN #Random");
getOutput().println("JOIN #Modnar");
if (line.contains("JOIN :#Random")) {
joined = true;
System.out.println("JOINED #Random= true");
}
}
在这个方法的最后我调用 getOutput().flush();
现在,当我尝试通过正在编写的客户端向 IRCserver 发送消息时,似乎需要很长时间才能通过第一条消息。当它最终通过时,一切似乎都运行良好。所有后续消息都会立即处理。这只是我在连接并加入该频道后发送的第一条消息,需要很长时间。
我用来向服务器发送消息的方法很简单:
public void sendToServer(String input) {
getOutput().println(input);
getOutput().flush();
}
有没有人知道为什么第一条消息需要这么长时间才能传输到服务器,而以下所有(在第一条最终到达之后)都顺利?
如果值得一提:我正在使用 Tomcat6 作为我建立连接的 servlet,并使用 UnrealIRCd 作为 IRC 服务器。消息通过 AJAX 发送到 servlet。 (但是发送到服务器似乎进展顺利,因为发送消息时我正在执行的 System.out 会立即打印在我的 Tomcat 日志中,因此延迟在套接字或 IRC 服务器中。 )
如果需要更多信息,我会尽量提供,因为这可能看起来很复杂......
【问题讨论】:
-
如果将 flush() 移到 while 循环中会发生什么?
-
while 循环中实际上有一个刷新。但刷新是在最后,因为我还做了一些 XML 解析(将 XML 发送到客户端)和一个 ping 回复。
-
使用 Wireshark 监控流量并确定问题是发送延迟,还是服务器响应延迟。
-
如果找不到解决方案,我打算尝试一下。如果我今晚或明天有时间,我会试一试!