2012-04-22 1 views
-1

Я делаю программу клиента/сервера UDP. Клиент собирает данные и отправляет их на сервер.Проблема с сервером, принимающим несколько дейтаграмм UDP на одном порту

Клиент отправляет дейтаграмму со случайным номером порта на сервер на определенном UDP-порту 6789. Затем клиент и сервер используют случайный порт для обмена информацией.

Проблема заключается в том, что только один клиент может подключиться. Я чувствую, что это потому, что порт 6789 никогда не открывается снова для следующего клиента.

Это код только для сервера получения начального соединения на порт 6789.

public class MonitorServer extends Thread{ 

    public static void main(String[] args) { 

try{ 

    DatagramSocket connectSocket = new DatagramSocket(6789);  
    while(true) 
    { 
      String portString = ""; 
      int portInt = 0; 
      byte [] buffer = new byte[100]; 

System.out.println("portTest 01 " +portInt); 
      DatagramPacket portPacket = new DatagramPacket(buffer, buffer.length); 
      connectSocket.receive(portPacket); 
      portString = new String (portPacket.getData()); 
      connectSocket.disconnect(); 
      connectSocket.close(); 

System.out.println("portTest 02 " +portString); 
      portString = portString.replaceAll("[^0-9.,]+",""); 
      portInt = Integer.parseInt(portString); 

System.out.println("portTest 03 " +portString);      
      ClientConnection c = new ClientConnection(portInt); 
      new Thread(c).start(); 

System.out.println("portTest 04 " +portString); //<<-- never prints 
    } 
    } 

    catch (Exception e) {} 
} 

} 

Похоже, что этот раздел кода запускается только один раз. Я добавил System.outs для устранения неполадок, и похоже, что он останавливается на:

  ClientConnection c = new ClientConnection(portInt); 
      new Thread(c).start(); 

System.out.println("portTest 04 "); //<-- Never prints 

Мне нужно, чтобы он продолжал работать, чтобы принимать соединения. Что я делаю не так?

ответ

0

В вашем коде метод MonitorServer.startServer никогда не возвращается, поскольку он вводит бесконечный цикл while. Это означает, что конструктор MonitorServer никогда не возвращает, что означает, что цикл while в главном никогда не достигает закрытия и никогда не зацикливается. Вам необходимо запустить MonitorServer в новом Thread или Executor Service

+0

Спасибо за ответ Джон, я вынул цикл while, но с теми же результатами первый клиент подключается и отправляет данные. Ни один другой клиент не может подключиться после первого. – Joshua

+0

Опубликовать обновленный код –

+0

Отправленный код без петель. – Joshua

0

Вы должны создать сокет на 5678 один раз за пределами приемного контура. Не каждый раз, когда вы получаете.

NB В UDP нет такой вещи, как «connectig», кроме ограниченного материала, который DatagramSocket.connect() делает, что неизвестно одноранговому узлу.

+0

Спасибо за совет, я переместил создание connectSocket вне цикла while. Цикл while никогда не проходит мимо «новой темы (c) .start(); – Joshua

+0

@Joshua Вероятно, это не выходит за рамки нового ClientConnection (...), и это было бы потому, что вы выполняете некоторую операцию блокировки в этом конструкторе, должен быть в методе run(). – EJP

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