2010-10-01 3 views
2

Может ли кто-нибудь дать мне понять, почему конструктор ServerSocket никогда не возвращается в новый поток? (Я никогда не увидеть «Открылись» сообщения, выводимое на консоль.) Кажется, что основной поток предотвращает сокет сервера нити работает, войдя в Readline слишком быстро:ServerSocket заблокирован потоком, запрашивающим вход с консоли

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"); 
     } 
    } 

} 
+0

в какой среде вы используете это? Я вставил ваш код в Eclipse (удалив слово «public» из «public class SocketOpener ...», чтобы получить его в одном файле), и у вас не возникнет проблем с приложением «Opened» print. – Bryan

+0

Я просто запускал это, и он отлично работает для меня ... –

+0

Работает в Windows XP, Java SE Runtime Environment (сборка 1.6.0_20-b02), Java HotSpot Client VM (сборка 16.3-b01, смешанный режим, совместное использование) – user142450

ответ

0

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

+0

Это может быть возможно, хотя это кажется немного странным. Чтобы проверить, попробуйте ввести что-то для консоли и нажмите enter. Если «Открыто» всплывает, вы, вероятно, получили свой ответ ... Редактирование: Хорошо, я попытался поставить точки останова в обоих потоках, запустить основной поток и остановить поток SocketOpener, пока main не ожидал ввода, а затем продолжил , Я не видел проблем. Может быть артефактом использования Eclipse, а не raw javac. – Bryan

+0

Я набрал что-то в консоли и нажал кнопку ввода, и я вижу открытое сообщение. Однако я только что обнаружил, что если я использую Scanner вместо BufferedReader, он работает без меня, набирая что-либо. Odd – user142450

+0

Да, это странно –

0

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

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

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

Но может быть легко workarround:

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

+0

WindowsXP также проблематичен. Для Windows Server 2003 установка всех обновлений очень помогла. –