目前项目中碰到这样一个问题:
远程的设备向本地的服务器发送信息,一旦服务器监听这个信息后就新建一个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
{}
}
远程的设备向本地的服务器发送信息,一旦服务器监听这个信息后就新建一个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
{}
}
这句如果不有连接会阻塞的,不用怕;
我现在能够在BeginListening()接收到远程设备的第一次连接时(新建了SOCKET)的数据,但是以后每次的数据在BeginListening()里就接收不到了,所以我就把socket放在了哈希表里面,同时新开了线程ThreadFunc_svm(object obj),但是还是不能很好的接收到每个远程设备的数据,
郁闷......
你的设计思路跟我现在的设计思路差不多,我是将每次的新建的SOCKET放在了哈希表里面,但是,怎么去读取哈希表里面每个socket的数据呢
哈希表是以设备ID为键和该设备向服务器发送的请求所新建的socket为值的