2

谁能告诉我为什么 ServerSocket 构造函数永远不会在新线程中返回?(我从来没有看到打印到控制台的“打开”消息。)似乎主线程通过太快地进入 readLine 来阻止服务器套接字线程运行:

public class Main
{
   public static void main(String[] args) throws IOException
   {
      new Thread(new SocketOpener()).start();

      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      String inLine = br.readLine();
      System.out.println(inLine);
   }
}

public class SocketOpener implements Runnable
{

   public void run()
   {
      try
      {
         System.out.println("Opening...");
         ServerSocket socket = new ServerSocket(4444);
         System.out.println("Opened");
      }
      catch (IOException ex)
      {
         System.out.println("IO Error");
      }
   }

}
4

2 回答 2

0

从 System.in 读取会导致很多问题:在某些情况下,您不能:

  1. 创建一个临时文件(因为 2)
  2. 阅读机器的 Inet4Adress
  3. 加载 DLL

我在 Windows Server 2003 及更早版本中遇到了一些此类问题。发生这种情况是因为 Win32-API 和 Java-VM 中的一些错误。

但可能有一个简单的解决方法:

仅调用 System.in.read(),如果 System.in.availiable() 返回的值大于 0。

于 2010-11-02T14:55:09.860 回答
0

我认为阻塞的不是 ServerSocket 构造函数,而是 System.out.println("Opened")。主线程试图从 System.in 读取的事实阻止了在 System.out 上完成输出。

于 2010-10-01T05:53:16.853 回答