【求救...】c# SOCKET多线程方面的问题
目前项目中碰到这样一个问题:远程的设备向本地的服务器发送信息,一旦服务器监听这个信息后就新建一个SOCKET对象,同时新建一个线程,接收这个socket接下来要发送的数据。
问题是:我目前的代码只能接收到一个远程设备端所发来的代码,不能同时接收到多个远程设备发来的数据,郁闷...
由于本人是新手,请客为大仙帮帮忙啊.....
补充:远程设备发送数据的模式是这样的:第一次发送的数据时设备编号,第n次(n>1)才是设备状态数据(不含设备编号),一旦远程设备断开重新连接后还是第一次发设备编号,第n次(n>1)发送状态数据(不含设备编号)
代码如下:
public void BeginListening()
{
while (true)
{
byte[] message = new byte[100];
if (ProjectContral.tcpListen.Pending())
{
try
{
Socket newSocket = ProjectContral.tcpListen.AcceptSocket();
svmMsg = new AnalyseData(message);
string router_ID = svmMsg .RouterID();
if (!svm_tb.ContainsKey(router_ID))
{
svm_tb.Add(router_ID, newSocket);// svm_tb哈希表,存储设备ID和该设备对应的SOC
}
Thread svmThread = new Thread(new ParameterizedThreadStart(ThreadFunc_svm));
svmThread.IsBackground = false;
svmThread.Start(router_ID);
Thread.Sleep(50);
}catch
{}
}
}
}
private void ThreadFunc_svm(object obj)
{
Socket svmSkt = svm_tb[obj] as Socket;
string router_ID = obj.ToString();
try
{
while (true)
{
byte[] bytes_msg = new byte[46];
svmSkt.Receive(bytes_msg);
//处理得到的数据
}
}catch
{}
} --------------------编程问答-------------------- 就是短连接呀,第一次能收到,第二次应该也可以建立连接的,先不要在while里加条件:Socket newSocket = ProjectContral.tcpListen.AcceptSocket();
这句如果不有连接会阻塞的,不用怕; --------------------编程问答-------------------- 用多线程,一个线程一个连接,保存在连接列表里,我用VC做过,不过程序结构都差不多的 --------------------编程问答-------------------- 在接收处做循环。并把有用户连接作为一个事件,一旦得到客户端返回的socket对象九触发该事件。此外仿照IOCP完成端口也可以处理。 --------------------编程问答-------------------- 学习了,最近也在研究Modbus,可是没有什么进展,头疼 --------------------编程问答-------------------- 回复一楼的大仙:
我现在能够在BeginListening()接收到远程设备的第一次连接时(新建了SOCKET)的数据,但是以后每次的数据在BeginListening()里就接收不到了,所以我就把socket放在了哈希表里面,同时新开了线程ThreadFunc_svm(object obj),但是还是不能很好的接收到每个远程设备的数据,
郁闷...... --------------------编程问答-------------------- 回复二楼的大仙:
你的设计思路跟我现在的设计思路差不多,我是将每次的新建的SOCKET放在了哈希表里面,但是,怎么去读取哈希表里面每个socket的数据呢
哈希表是以设备ID为键和该设备向服务器发送的请求所新建的socket为值的
补充:.NET技术 , C#