2014-12-17 10 views
1

У меня есть реализация, где я слушаю порт событий и выполняю обработку на основе ввода. Я сохранил его в бесконечном цикле. Однако он работает только один раз, а затем я снова должен перезапустить программу. Ли контроль никогда не возвращается. Является ли этот бесконечный цикл хорошей идеей?бесконечный цикл для прослушивания сокета

Integer port = Integer.parseInt(Configuration.getProperty("Environment", "PORT")); 
ServerSocket serverSocket = new ServerSocket(port); 
LOG.info("Process Server listening on PORT: " + port); 
while(true){    
    Socket socket = serverSocket.accept(); 
    new Thread(new ProcessEvent(socket)).start(); 
} 
+1

«Однако он работает только один раз, а затем мне нужно снова перезапустить программу». Я не понимаю - это бесконечный цикл. Почему он только «работает один раз»? Выходит ли цикл из-за исключения, возникшего внутри него? «Эта бесконечная петля - хорошая идея». - Конечно, почему бы и нет? Большинство нетривиальных потоков являются «бесконечными циклами», иначе они заканчиваются кодом :) –

+0

Эта программа будет выполняться неограниченно и принимать любое количество подключений с учетом того, что происходит в классе «ProcessEvent», который вы еще не опубликовали. Неясно, что вы спрашиваете. – EJP

+0

В двух словах я читаю файл и копирую его в другую папку. Предполагая, что исключение/ошибка не происходит, он отлично завершается. Этот поток автоматически передает управление обратно на главный код основного блока или этот бесконечный цикл продолжает работать независимо от завершения потока или нет и продолжает блокировать socket.accept() – avinashkr

ответ

1

После того, как вы начали нить, обрабатывать клиента, вы также должны цикла на функцию чтения, потому что после того, как вы прочитали сообщение, вам необходимо прочитать следующие сообщения. accept() вернется только один раз на клиентское соединение. После открытия соединения все происходит в потоке, пока соединение не будет закрыто.

Петля на accept() - хорошая идея, но порожденная нить не должна выходить, пока ваш клиент подключен. Если вы намеренно закрываете соединение, тогда это должно быть хорошо, если вы убедитесь, что он правильно обрабатывается с обеих сторон, и клиенту необходимо снова открыть соединение для дальнейшего общения.

Смежные вопросы