2011-02-01 4 views
2

Я участие следующих проблем:один сервер нескольких клиентов

  1. мне нужно написать программу сервера, будет принимать несколько клиентов
  2. всех клиентов подписываются одни и те же данные с сервера, например, цена акций Обновить.
  3. каждый клиент может посылать простые команды на сервер, как «вход», «стоп»

Так вот мое решение, так как я не очень Произошел в многопоточном/TCP, я хочу знать, это хорошо решение? если нет, есть ли лучшее решение? нужно ли иметь поток для каждого клиентского сокета? Спасибо BTW: извините за запутывание каждого, это небольшой проект, который включает только 5-10 классов.

class AcceptThread { 
    ...... 
    public void run() { 
     ControlThread controlThread = new ControlThread(); 
     controlThread.start(); 

     Socket socket = new Socket(port); 
     while (!stop) { 
      Socket s = socket.accept(); 
      controlThread.addClient (s); 
     } 
    } 
} 

class ControlThread { 
    Set<Scoket> clients; 
    SendDataThread sendDataThread; 

    public ControlThread() { 
     sendDataThread = new SendDataThread(); 
     sendDataThread.start();  
    } 

    public void addClient (Socket socket) { 
     clients.add(socket); 
     sendDataThread.addListener(socket); 
    } 

    public void run() { 
     ...... 
     for (Socket s : clients) { 
      if (s.getInputStream().available()) { 
       //read command from s 
      } 
     } 
     ......    
    } 
} 

class SendDataThread() { 
    Set<Scoket> listeners; 

    public void addListener (Socket s) { 
     listeners.add(s); 
    } 

    public void run() { 
     for (Socket s: listeners) { 
      // send data to each listener 
     } 
    } 
} 
+0

Если это не домашнее задание, вы должны посмотреть на существующие решения, такие как [JMS] (http://en.wikipedia.org/wiki/Java_Message_Service) вместо того, чтобы начинать с нуля. –

+0

Socket dont 'имеет метод приема ... – JasonHuang

ответ

3

является необходимым иметь резьбу для каждого сокета клиента?

Нет, по сути, я бы даже не рекомендовал его. Если это небольшой проект, и вы не хотите использовать какую-либо существующую библиотеку, я предлагаю вам использовать java.nio package и SelectableChannels. С помощью так называемого селектора вы можете легко контролировать клиентов для входящих данных неблокирующим способом.

Вот несколько полезных ссылок:

0

Что об использовании технологии стандартов для решения этой проблемы?

JMS тема механизм распределения для публикации сообщений, которые доставляются несколько абонентов.

Tutorial

+1

Я считаю систему JMS несколько тяжелой и на самом деле не выигрывает, если ее использовать в больших масштабах. Кроме того, вы, вероятно, в конечном итоге будете использовать менее легкие серверы приложений для его поддержки (например, jboss вместо tomcat/jetty). Хорошая и полезная техника в правильном проекте. –

+0

Вы правы, проект, о котором я говорю, - это небольшой проект, как вы думаете, мое решение является хорошим для небольшого проекта? – Leon

+0

Абсолютно, для меня это половина эффективности, но в два раза больше удовольствия от программных сокетов. Существует много хороших высокоуровневых средств, но нет ничего принципиально неправильного в написании программирования сокетов самостоятельно. –

0

Спасибо BTW: извините за путаницу каждый, это небольшой проект, который включает только 5-10 классов.

В этом нет ничего страшного. Все абстракции верхнего уровня основаны на сокетах так или иначе. Если ваш проект достаточно велик, нет необходимости тянуть серию других рамок/инструментария для выполнения той же работы. Нитки дешевы (и могут даже выиграть от многоядерной архитектуры), хотя использование SelectableChannels в качестве предложенного @aioobe тоже неплохая идея.

Когда ваши проекты требуют этого, вы всегда можете узнать о других методах коммуникации между процессами (передача сообщений, удаленный метод invocaton и т. Д. И около 100 реализаций).

Однако вы можете ограничить количество потоков, используемых сервером одновременно. Это может быть легко достигнуто путем утверждения, например, семафора размера, равного количеству потоков, которые вы хотите обслуживать.Еще одна интересная вещь - использовать java thread pools, чтобы лучше использовать ресурсы.

+0

Красивый ответ. Я просто не согласен с одной точкой: подход с одним потоком на клиент * * * легко адаптируется к пулам потоков, поскольку вся идея с одним потоком на клиенте заключается в том, что она позволяет использовать блокировку io. Если вы используете блокировку io, пул потоков не принесет вам много пользы. – aioobe

-1

Другие упомянули, что вы можете использовать библиотеку nio для уменьшения количества необходимых потоков. я просто хотел указать, что ваш текущий примерный код не будет работать. вы должны использовать при использовании стандартных потоков io. метод available() практически бесполезен (в общем) и не остановит ваш поток управления от блокировки.

+0

downvoter не прокомментировал? – jtahlborn

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