2016-12-15 5 views
0

Итак, я создаю небольшое приложение для чата, но у меня возникают проблемы с настройкой моего сервера. Код ниже мой конструктор в моем сервере теме:.Бесконечный цикл при попытке создать потоки

public ServerThread() { 
    System.out.println("Before"); 

    try { 
     ServerSocket serverSocket = new ServerSocket(3500); 
     socket = serverSocket.accept(); 
     System.out.println("After"); 
     outputStream = new ObjectOutputStream(socket.getOutputStream()); 
     inputStream = new ObjectInputStream(socket.getInputStream()); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    executor = Executors.newFixedThreadPool(3); 
    connected = true; 
} 

Как вы можете видеть, у меня есть 2 печатные издания, «До» и «После того, как между этими двумя, что-то happends что вызывает программу для входа в бесконечный цикл. socket = serverSocket.accept(); Я тоже не могу поймать исключение. Не знаю, что здесь не так.

+3

Вы даже знаете, что 'accept()' делать? –

+0

Подсказка: попробуйте подключиться к вашему запущенному серверу на 3500 и увидеть, что «бесконечный цикл» не так бесконечен. – dasblinkenlight

+1

Серверный разъем ** WAITS ** для запросов, поступающих по сети. Ваш 'serverSocket.accept();' будет ждать, пока соединение не будет выполнено. –

ответ

0

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

У вас есть вопросы? Вы уверены, что ваш клиент подключается нормально?

0

ServerSocket - «Сету сервера ожидает, что запросы поступят по сети». Он выполняет некоторую операцию на основе этого запроса, а затем, возможно, возвращает результат запрашивающему.

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

Итак, как вы можете это проверить?

Попробуйте создать класс клиента и подключить его к серверному приложению. то есть -

socket = new Socket(<serverName/host/ip>, <serverPort>); 
     System.out.println("Connected: " + socket); 

Когда сервер работает, попробуйте запустить данный код, он будет посылать запрос и сервер будет обрабатывать его соответствующим образом. Надеюсь, это поможет :)

+0

Да, я это понимаю, но пока клиент не подключился, вся программа freezez и сбой в течение нескольких секунд. Это происходит, хотя соединение происходит в другом потоке, а затем в потоке gui. – snubbegubben

+0

Если клиент не подключен, сервер должен зависнуть (поскольку здесь нет цикла, он будет обрабатывать одно соединение). Можете ли вы попробовать запустить сервер без потока, поскольку один сервер может обрабатывать несколько запросов? + Если я не ошибаюсь, вы пытаетесь создать 3-х серверную нить, и все они должны работать на порте 3500. (Pl. Correct my understanding) Пожалуйста, закройте сокет после использования. – freesoul

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