想做一个Tcp通信的实例,不过服务端是用C#写的,客户端是用java(android)写的,本来只是实现两者互传一次数据,没有什么问题,都正常,后来就想实现以下的流程:
1、建立tcp连接
2、建立tcp连接之后,客户端发送信息给服务端
3、服务端接收信息后发送指令给客户端,让客户端执行指定的操作
4、客户端完成指定操作后发送执行的结果
5、以上都是在一个Tcp连接中进行的
本来其实就是客户端发送两次数据给服务器端而已,但是在服务器端发现接收不到客户端的第二次发送的信息(就是执行的返回结果)
后来客户端通过log发现,客户端也没收到服务器端的信息
但是奇怪的是,如果服务器端不接收第二次信息的时候(去掉第二次接收的代码),客户端是可以收到的,也就是说服务器端第二次的接收却导致客户端也收不到数据
代码如下:
//(C#)----------服务器端发送信息的代码片断---------------
//sendTcpString是要发送的字符串
string sendTcpString = te.getTcpString();
byte[] sendData = Encoding.UTF8.GetBytes(sendTcpString);
streamTcp1 = clientTcp.GetStream();//获取网络流
streamTcp1.ReadTimeout = 3000;
streamTcp1.Write(sendData, 0, sendData.Length);//将数据写入网络流
两次接收都是一样的代码
//(C#)-------------服务器端接受信息的部分代码--------------------
streamTcp2 = clientTcp.GetStream();
streamTcp2.Read(dataTcp, 0, dataTcp.Length);
string receiverString = Encoding.UTF8.GetString(dataTcp).Trim('\0');
//(java)-------------客户端接受信息的部分代码--------------------
br = new BufferedReader(new InputStreamReader(socketTcp.getInputStream()));
String line = br.readLine();
Log.d("TCP", "TCP Client接收到的回复是<-----" + line);
后来就断点调试发现问题出现在br.readLine();这里,,程序在这里就停住了,后来在网上查询知道惹readLine()这个方法是会一直读取,直到读取到的是结束符,或者连接断开,这时候就有点明白了,因为我在服务端那里发送数据的时候,结尾是没有加结束符的,可是当我去掉服务端第二次接收的代码时,为什么就可以呢,原来是因为我第一次接收完之后就把连接断开了,所以就自然接收到了,加上回车之后就可以正常工作了
//跟java通信的时候记得加\n
string sendTcpString = te.getTcpString()+"\n";
这个问题给我带来的启示就是,无论遇到什么问题,先找出根本原因,针对性解决,,将问题细化,总是可以解决问题的