2010-12-14 3 views
2

Я пытаюсь понять многопоточность в TCP, поэтому я кодирую базовый текст telnet «router».Отправка инструкций в поток, ожидающий TCP?

с использованием ReadLine() каждый поток, использующий прослушиватель TCP, будет ждать ввода от клиента telnet и затем отвечать на основе отправляемого текста. У меня это работает с несколькими потоками и несколькими клиентами telnet.

Я хочу условно отправлять сообщения по всем темам. Например, если текст, отправленный из одного потока, является «Alert!» то я хочу, чтобы каждая нить для подключенных клиентов выполнялась WriteLine("Alert!")

Имеет ли это смысл? Моя проблема в том, что я не знаю, как сделать один поток поднять событие в другом потоке.

ответ

1

Вам необходимо посмотреть на шаблон Брокер событий. В принципе, у вас будет один объект с событием, на которое подписаны все ваши потоки. Он также будет иметь метод, который можно вызвать, который будет вызывать событие. Это может показаться сложным, но довольно простым.

Пример кода http://msforge.net/blogs/paki/archive/2007/11/20/EventBroker-implementation-in-C_2300_-full-source-code.aspx.

+0

Да, это отличное начало, спасибо! Теперь есть следующая проблема выполнения записи для каждого потока ... – Matthew

+1

, который должен быть достаточно прост в работе с обработчиком событий, который подписывается на событие. –

+0

Любые указатели? Проблема в том, что сеансы telnet в основном сидят на 'readline' ... как я могу выполнить' writeline' в этом же сокете из обработчика событий? Я думаю, мне, возможно, придется создавать статические сокеты? – Matthew

0

Не думайте о потоках как данных. Думайте о них как о конструкциях.

Очевидно, что класс A поднимет событие в классе B, B должен указать A и подписаться на его событие.

Но, честно говоря, я думаю, вы идете по этому пути неправильно. У вас есть один прослушиватель TCP. Когда приходит сообщение, вы получите объект веб-запроса, и вы можете обрабатывать его в своем потоке. При обработке потока, если вы найдете слово «Alert», сгенерируйте событие в класс более высокого уровня. Затем обработайте событие и сделайте все, что нужно сделать. Пример архитектуры:

Менеджер создает экземпляр TcpHandler и подписывается на его событие AlertReceived. TcpHandler создает экземпляр MessageProcessor и подписывается на его событие MessageReceived.

Когда TcpHandler что-то считывает с объекта TcpListener, запустите класс MessageProcessor и попросите его прочитать фактические данные в другом потоке.

Пожар сообщения MessageReceived. Затем в классе TcpHandler обработайте событие. Если полученные данные являются «Alert», запустите событие AlertReceived.

Класс менеджера поймает мероприятие и сделает все, что вы пожелаете.

+0

, если вы используете сеанс telnet, вам нужно поддерживать соединение открытым и разговаривать с каждым клиентом, которое должно выполняться в его собственном потоке. n количество клиентов равно n числу потоков с каждым своим собственным слушателем, который ждет ввода от клиента. –

+0

@Pauli Хорошая точка, давно не использовали telnet. – AngryHacker

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