Java ServerSocket.accept方法的奇怪行为

Java ServerSocket.accept方法的奇怪行为,java,sockets,Java,Sockets,我创建了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 = serverS

我创建了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();
  }
}
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();
  }
}
}

我基于oracle网站()的示例编写了这段代码。当我将带有serverSocket.accept()的行放在循环中时,serverSocket没有接收到一些数据包。我确信这个TCP数据包是在我的网络接口上收到的,因为我后来用Wireshark检查了它。我不知道是什么导致了这个问题,所以我尝试了不同的方法,我注意到当我像这样更改代码时,收到了更多的数据包:

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();
  }
}
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数据包都到达套接字的原因是什么?

您在第一个版本中接受了两次。因此,第一个连接被接受并丢弃,然后您接受第二个连接。在每个循环迭代中,您应该只有一个accept。现在您编辑了放在第一位的代码,您确定这就是您现在使用的代码吗?我写这篇文章时出错,我已经更改了它。谢谢你的评论。是的,这就是我的代码现在的样子。就像我说的,它类似于示例2:我在文章中提到的url中的多线程服务器示例。