C# 具有返回值的线程化网络侦听器
我目前正在尝试完成一个项目,它侦听多个端口并接收传入的数据 DeviceListener类: -我有一个名为PortListener的方法。它有两个参数,分别是IP和端口地址。它持续侦听特定端口的传入数据 -另一种方法称为StartListen,它在线程中运行PortListener 主程序: -它获取端口列表,并使用StartListen方法为每个端口启动PortListenerC# 具有返回值的线程化网络侦听器,c#,multithreading,sockets,network-programming,C#,Multithreading,Sockets,Network Programming,我目前正在尝试完成一个项目,它侦听多个端口并接收传入的数据 DeviceListener类: -我有一个名为PortListener的方法。它有两个参数,分别是IP和端口地址。它持续侦听特定端口的传入数据 -另一种方法称为StartListen,它在线程中运行PortListener 主程序: -它获取端口列表,并使用StartListen方法为每个端口启动PortListener Psuedo Like Code: class DeviceListener() { private s
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);
}
}
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.
}
}
我的问题是我无法将接收到的数据返回到主程序
是否有方法获取每个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);
}
}
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.
}
}
我通过使用委托方法解决了这个问题
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);
}
}
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.
}
}
谢谢Vadim。我会看看文章。从线程的角度来看,这正是管理传入数据的正确方法。根据您期望的连接数,选项2可能更好。存储数据,向线程发送信号,表示您有可用数据,然后返回。这允许您在维护其他连接时具有非常低的延迟s、 线程可以轻松地进行处理。谢谢Vadim。我会看看文章。从线程的角度来看,这正是管理传入数据的正确方法。根据您期望的连接数,选项2可能更好。存储数据,向线程发送信号,表示您有可用数据,然后返回。这使您可以非常轻松地服务其他连接时的延迟。线程可以轻松地执行该进程。