套接字代码创建新的编写器?

时间:2015-09-15 23:05:09

标签: java sockets while-loop

我有一个带有while循环的代码示例,其中包含true。我认为这会永远运行,直到程序或类停止。但是,我很困惑,因为每次运行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

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

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

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

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

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

Socket clientSocket = serverSock.accept();

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

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

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

  clientOutputStreams.add(writer);

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

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

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

  t.start();

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

我希望能回答你的问题。

答案 1 :(得分:1)

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

注意:此代码已损坏,可以轻松抛出OutOfMemoryError,因为它不会限制创建的线程数,请考虑使用managed thread pool