我目前正在尝试完成一个项目,该项目会侦听多个端口并收到传入的数据。
DeviceListener类:
- 我有一个名为 PortListener 的方法。它需要两个参数,即IP和端口地址。它不断监听特定端口的传入数据。
- 另一种方法称为 StartListen ,它在一个线程中运行 PortListener 。
主程序:
- 获取端口列表,并使用 StartListen 方法为每个端口启动 PortListener 。
Psuedo Like Code:
class DeviceListener()
{
private string PortListener(string ip, int port)
{
//listen ip and port.
//wait for data.
//recieve and return data.
RecieveData();
string data = recieved data;
return data;
}
public void StartListen(string ip, int port)
{
//start PortListener in a thread
Thread t = new Thread (() => PortListener(ip,port));
t.Start();
}
}
void Main()
{
ip = ip adress;
List portlist;
foreach (port in portlist)
{
string data = DeviceListener.StartListen(ip, port);
}
}
我的问题是我无法将收到的数据返回到我的主程序。
有没有办法为每个PortListener线程获取收到的数据?
答案 0 :(得分:4)
您可以执行以下操作 -
添加您希望接收的数据类型的队列。最好使用同步版本或创建自己的版本,取决于.Net。见http://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx。将您获得的每个新内容添加到队列中并使队列公开,以便其他类可以访问它。其他希望访问传入数据的线程可以读取队列,如果队列为空则阻止,或者通过定期检查是否存在项目来轮询。
另一种选择是使用事件(http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx)您的类可以公开存在相关数据的事件,并在数据到达时调用它。其他类将注册并将收到新传入数据的通知。< / p>
如果您有一个读取实体,第一个选项会更好,如果多个实体对数据感兴趣,第二个选项会更好。
答案 1 :(得分:0)
我使用委托方法解决了这个问题。
class DeviceListener()
{
public delegate void PassData(string str);
public PassData passdata;
private void PortListener(string ip, int port)
{
//listen ip and port.
//wait for data.
//recieve and return data.
RecieveData();
string data = recieved data;
passdata(data);
}
public void StartListen(string ip, int port)
{
//start PortListener in a thread
Thread t = new Thread (() => PortListener(ip,port));
t.Start();
}
}
void Main()
{
DeviceListener.passdata = new DeviceListener.PassData(Some_Function);
ip = ip adress;
List portlist;
foreach (port in portlist)
{
DeviceListener.StartListen(ip, port);
}
private void Some_Function(string data)
{
//do something with returned string.
}
}