我创建了类SocketListener以通过TCP协议接收数据。我的开始方法如下:
public void start() throws IOException {
LOGGER.log(Level.INFO, "SOCKET LISTENER STARTED PORT: " + port);
serverSocket = new ServerSocket(port);
while (true) {
FrameParser fp;
try {
socket = serverSocket.accept();
fp = new FrameParser(socket);
Thread thread = new Thread(fp);
thread.start();
} catch (Exception e) {
resetConnection();
}
}
}
编写此代码我基于oracle网站(http://www.oracle.com/technetwork/java/socket-140484.html#server)的示例。当我在serverSocket.accept()内部放置一行时,ServerSocket没有收到一些数据包。我确信这个TCP数据包是在我的网络接口上收到的,因为我稍后使用Wireshark检查了它。我不知道是什么导致了这个问题所以我尝试了不同的东西,我注意到当我改变我的代码时收到了更多的数据包:
public void start() throws IOException {
LOGGER.log(Level.INFO, "SOCKET LISTENER STARTED PORT: " + port);
serverSocket = new ServerSocket(port);
socket = serverSocket.accept();
while (true) {
FrameParser fp;
try {
fp = new FrameParser(socket);
Thread thread = new Thread(fp);
thread.start();
} catch (Exception e) {
resetConnection();
}
}
}
我使用试错法进行了此修改,不幸的是,在此更改之后,我的应用程序开始接收的数据比我在Wireshark中过滤的数据要多(例如在Wireshark中我看到了10个数据包,但我的应用程序创建了数百个新线程,但它完成了内存错误)。
在第一种情况下,并非所有TCP数据包都到达套接字的原因是什么?