2010-12-14 22 views
2

我想了解TCP中的多线程,所以我编写了一个基本的telnet文本“路由器”。使用一个TCP监听器将等待从Telnet客户端输入,然后使用ReadLine()每个线程向正在等待TCP的线程发送指令?

回应此基础上发送的文本。我有多线程和多个telnet客户端的工作。

我想有条件地发送消息到所有线程。 例如,如果从任何一个线程发送的文本是“Alert!”然后,我想每一个线程用于连接的客户端执行WriteLine("Alert!")

这是否有道理? 我的问题是,我不知道如何让一个线程在另一个线程中引发一个事件。

回答

1

您需要查看一个Event Broker模式。基本上你会有一个事件,所有的线程订阅一个对象。它也会有一个可以调用的方法来调用事件。这听起来很复杂,但它很简单。

示例代码在这里http://msforge.net/blogs/paki/archive/2007/11/20/EventBroker-implementation-in-C_2300_-full-source-code.aspx

+0

是的,这是一个很好的开始,谢谢!现在,下一个执行每个线程的writeline的问题...... – Matthew 2010-12-14 23:34:41

+1

应该很容易在订阅该事件的事件处理程序中执行。 – 2010-12-14 23:57:54

+0

任何指针?问题是,telnet会话基本上是围绕在'readline'上的......我如何在事件处理程序的同一个套接字中执行'writeline'?我想我可能需要创建静态套接字? – Matthew 2010-12-15 00:04:52

0

不要将线程视为数据。将它们视为构造。

很明显,要让A类在B类中引发事件,B必须引用A并订阅其事件。

但说实话,我认为你会以错误的方式去做。有一个单一的TCP侦听器。当消息进入时,你会得到一个web请求对象,你可以在它自己的线程中进行处理。在处理线程时,如果您发现单词“Alert”,请为更高级别的类生成事件。然后处理事件并做任何需要完成的事情。示例体系结构:

管理器实例化TcpHandler并订阅其AlertReceived事件。 TcpHandler实例化MessageProcessor并订阅其MessageReceived事件。

当TcpHandler读的东西了它的TcpListener对象,关火MessageProcessor的类并将它读取另一个线程的实际数据。

触发MessageReceived事件。然后在TcpHandler类中处理事件。如果收到的数据是“Alert”,则触发AlertReceived事件。

经理类将抓住事件,并做任何你想要的东西。

+0

如果您正在运行telnet会话,则需要保持连接处于打开状态,并且必须在其自己的线程中完成与每个客户端的交谈。 n个客户端等于n个线程,每个线程拥有自己的监听器,等待来自客户端的输入。 – 2010-12-14 02:23:01

+0

@Pauli好点,好久没用好telnet了。 – AngryHacker 2010-12-14 02:34:38