目前项目中碰到这样一个问题:
远程的设备向本地的服务器发送信息,一旦服务器监听这个信息后就新建一个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
                 {}
         }         

解决方案 »

  1.   

    就是短连接呀,第一次能收到,第二次应该也可以建立连接的,先不要在while里加条件:Socket newSocket = ProjectContral.tcpListen.AcceptSocket();
    这句如果不有连接会阻塞的,不用怕;
      

  2.   

    在接收处做循环。并把有用户连接作为一个事件,一旦得到客户端返回的socket对象九触发该事件。此外仿照IOCP完成端口也可以处理。
      

  3.   

    回复一楼的大仙:
    我现在能够在BeginListening()接收到远程设备的第一次连接时(新建了SOCKET)的数据,但是以后每次的数据在BeginListening()里就接收不到了,所以我就把socket放在了哈希表里面,同时新开了线程ThreadFunc_svm(object obj),但是还是不能很好的接收到每个远程设备的数据,
    郁闷......
      

  4.   

    回复二楼的大仙:
    你的设计思路跟我现在的设计思路差不多,我是将每次的新建的SOCKET放在了哈希表里面,但是,怎么去读取哈希表里面每个socket的数据呢
    哈希表是以设备ID为键和该设备向服务器发送的请求所新建的socket为值的