目前在做一个程序,安卓手机每一秒钟向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就没问题了。