安卓和C# 用TCP通信发送数据

目前在做一个程序,安卓手机每一秒钟向PC机发送若干条数据,有可能一台机器发,也有可能若干台同时发,PC机用C#接收数据。我测试了一台安卓发数据可以正常接收,可是当若干台同时发数据的时候,就出现问题了。后来我发现不知道为什么,这些安卓设备的IP地址用DHCP自动获取IP的时候IP都是一样的,我想会不会就是因为两个相同IP的机器发送数据的时候,因为后来发后数据的机器会把原先正在发送的机器建立的TCP通信链接给关掉然后自己在发送数据,现在由于实验室路由器比较特殊,我没有权限改成静态获取,所以在此问一下是不是因为这个原因出的错,下面列出代码,麻烦大家帮忙看一看,出错的地方我用注释标记出来了
安卓端发送数据代码

 public void sendToPC(String data){
 try {
            s   =new Socket("192.168.0.104",8730);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
          DataOutputStream dout=null;   
           try 
           {
            dout =new DataOutputStream(s.getOutputStream());
           Thread.sleep(50, 0);            
            dout.writeBytes(data);
            dout.flush();
           }catch(Exception e){

           }
    }

C#段代码

  class ReceiveData
    {
        private TcpListener myListener;
        private TcpClient tcpClient = null;
        private NetworkStream netStream;
        private IPAddress localAddress = IPAddress.Parse("192.168.0.104");
        public ReceiveData()
        {
            myListener = new TcpListener(localAddress, 8730);
            myListener.Start();
            Thread listenThread = new Thread(listenConnect);
            listenThread.IsBackground = true;
            listenThread.Start();
        }
                  private void listenConnect()
        {
            while (true)
            {
                tcpClient = myListener.AcceptTcpClient();
                //获取网络流
                netStream = tcpClient.GetStream();
                Thread receiveThread = new Thread(receiveData);
                receiveThread.IsBackground = true;
                receiveThread.Start(tcpClient);

            }
        }
        string receiveString = "";
        public void receiveData(object obj)
        {
            while(true){
               byte[] myReadBuffer = new Byte[1024];
               int numberOfBytesRead = 0;
               StringBuilder myCompleteMessage = new StringBuilder();
               int nodeId = 0;
               do
               {
                   numberOfBytesRead = netStream.Read(myReadBuffer, 0, myReadBuffer.Length);//出错总是在这一句,提示错误“远程主机主动关闭现有连接”
                   myCompleteMessage.AppendFormat("{0}", Encoding.UTF8.GetString(myReadBuffer, 0, numberOfBytesRead));
               } while (netStream.DataAvailable);
               receiveString = myCompleteMessage.ToString();
               string[] receivearr = receiveString.Split('!');
               for (int i = 0; i < receivearr.Length-1;i++ )
               {

                   string[] infoarr = receivearr[i].Split('#');
                   DoWork(infoarr[1], infoarr[0]);
               }


            }
        }
                }

扫了下代码,发现你的netStream对象只有一个,每次有新链接进来的时候都会赋值给新链接,然后你原链接的数据接收方法receiveData,在无限循环里就变成使用新的链接传进来的流了,这必须出错啊。

不是跟你说了吗,你的代码有问题啊,netStream对象每次都赋值成最新的链接的流,你旧的不关就等于用旧的链接继续读新链接的流,肯定出错啊。你把netStream当成变量传入receiveData,在receiveData读这个局部变量的netStream就没问题了。