【问题标题】:Socket Code creating new writers?套接字代码创建新作家?
【发布时间】:2023-03-25 13:18:01
【问题描述】:

我有一个代码示例,其中有一个包含 true 的 while 循环。我假设这将永远运行,直到程序或类停止。但是,我很困惑,因为每次运行 while 循环时都会生成一个新的 PrintWriter。我认为这将是一个问题。还创建了一个新线程。我是不是看错了这段代码。

public static void main (String[] args) {
  new VerySimpleChatServer().go();
}

public void go() {
  clientOutputStreams = new ArrayList();
  try {
    ServerSocket serverSock = new ServerSocket(5000);

    while(true) {
      Socket clientSocket = serverSock.accept();
      PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
      clientOutputStreams.add(writer);

      Thread t = new Thread(new ClientHandler(clientSocket));
      t.start();
      System.out.println(“got a connection”);
    }
  } catch(Exception ex) {
    ex.printStackTrace();
  }
} // close go

看起来,它只在建立新连接时运行,但代码的哪一部分证明了这一点。看起来好像在不断地创建一个新的作者和新的线程。

谁能解释一下?

【问题讨论】:

    标签: java sockets while-loop


    【解决方案1】:

    仅当套接字可用时才会创建写入器,因为serverSock.accept() 正在阻塞(当套接字在其队列中可用时返回)。

    注意:此代码已损坏并且很容易抛出 OutOfMemoryError,因为它不限制创建的线程数,请考虑改用 managed thread pool

    【讨论】:

    • 哦,ServerSocket accept() 使 while 循环无法继续。我什至没有想到这种可能性。谢谢。我也会考虑使用托管线程池。
    • @mc805 它阻塞直到出现入站连接。
    【解决方案2】:

    每个循环都会创建一个新线程,因为它在 while 循环中。

    你有while(true),所以除非你打破循环,否则它会永远继续下去。

    现在来分解循环中实际发生的事情

    Socket clientSocket = serverSock.accept();

    服务器接受来自客户端的新连接。

      `PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());`
    

    使用新的客户端输出流创建一个新的 PrintWriter 对象。请注意,这是针对每个客户端完成的,因为客户端不会有相同的输出流。

      clientOutputStreams.add(writer);
    

    假设这只是您可以用来写入客户端的所有 PrintWriter 的列表。

      Thread t = new Thread(new ClientHandler(clientSocket));
    

    创建了一个新的 Thread 对象,不确定 ClientHandler 中有什么,但它必须有一些 run 方法。

      t.start();
    

    线程已启动。服务器可以继续接受新的连接。

    我希望这能回答你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 2013-09-10
      • 1970-01-01
      相关资源
      最近更新 更多