日期:2014-05-19  浏览次数:20715 次

知道socket的大手们进
是这样的,我写了一个服务器是专门用来接数据的,差不多有30个客户端,客户端全是C++写的,我只负责服务器的开发,现在接发数据基本上正常,但是还是有问题。

问题如下:
1.客户端与服务器是长连接的,1秒给服务器一条数据如果30秒内没有往服务器发送数据服务器会自动把客户端断开,问题是客户端发送数据很正常的时候就莫名其妙的断开了,我服务器这边没有捕获到任何我自己打印的异常
2.服务器会每30秒向各个客户端回复一条确认消息,回复是很正常,但是回复的消息本来应该回复给A的,却莫名其妙的给了B。
3.客户端发送的数据过长的时候,比如有4000多个字节,服务器读消息有的读的消息是对的,有的读着读着就读成空字符了,比如:
A123|4101|15386|……省略N个字符|1|……此处省略的全是空字符|,用编辑器打开就是口子型的乱码 (4010表示消息长度)

这个问题困扰了我2个多月了,一直找不到问题的关键所在,到底是客户端的问题还是我服务器的问题,我也编写了客户端做过测试了,我自己编写的客户端只有问题2存在

希望有经验的大手门指点指点,到底是哪里的问题。
进一步解决问题可以联系我,我的邮箱297424058@qq.com,拜托!!

------解决方案--------------------
我前段时间写了个android的客户端的,服务器是C++做的,好像是有些东西要注意,晚上再看看
------解决方案--------------------
有些数据类型需要转码的好像,字符串类型的也要转码,给你段代码你参考一下
public static String getString(byte[] b, int offset)
{
int i;
for(i = 0; i < (b.length - offset); i +=2)
{
if((b[offset+i] == 0)&&(b[offset+i+1] == 0))
break;
}
byte[] bTemp = new byte[i];
Arrays.fill(bTemp, (byte) 0);
System.arraycopy(b, offset, bTemp, 0, i);
Charset cs = Charset.forName ("UTF-16LE");
ByteBuffer bb = ByteBuffer.allocate(bTemp.length);
bb.put(bTemp);
bb.flip();
CharBuffer cb = cs.decode(bb);
return cb.toString();
}
如果不是这个问题那就可能是读输入流的问题。
你说发给A的消息被B接收了,具体我不清楚,但是我觉得消息包头应该有一个人员的标志位,即使B接收到了但是当B解析到消息不是发给他的,那也没必要读消息
------解决方案--------------------
编码格式用GBK试试
------解决方案--------------------
楼上的真是不懂啊,哪能用GBK啊,晕死

要是C++跟java通信的话最好用ASCii码,这个不会出现乱码的

这个原理是网络的字节序不一样,特别是数字的
------解决方案--------------------
是不是读输入流的问题呢,能把你读输入流的代码粘出来吗
------解决方案--------------------
服务器的我没弄过,写过一点点也只是客户端,对发给a的b却接受了的原因不清楚
------解决方案--------------------
我曾经 遇到过这个问题,对于 读取大包时出现空字符问题.也是java与C++联调时候出现的,后来用了一个方法解决。你的这个问题,应该是两边对socket流读写,没有异步而导致的。