ServerSocket заблокирован потоком, ищущим ввод из консоли - PullRequest
2 голосов
/ 01 октября 2010

Может кто-нибудь дать мне понять, почему конструктор 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");
      }
   }

}

Ответы [ 2 ]

0 голосов
/ 02 ноября 2010

Чтение из System.in вызывает много проблем: при некоторых обстоятельствах вы не можете:

  1. Создать временный файл (из-за 2)
  2. Читать Inet4Adressвашей машины
  3. Загрузка DLL

Я столкнулся с некоторыми из этих проблем с Windows Server 2003 и более ранними версиями.Это происходит из-за некоторых ошибок в Win32-API и Java-VM.

Но может быть простой обходной путь:

Вызовите только System.in.read (), если System.in.availiable () возвращает значение больше 0.

0 голосов
/ 01 октября 2010

Я не думаю, что блокирует конструктор ServerSocket, а System.out.println («Открыт»). Тот факт, что основной поток пытается прочитать из System.in, препятствует выполнению выводов в System.out.

...