是这样的,我写了一个服务器是专门用来接数据的,差不多有30个客户端,客户端全是C++写的,我只负责服务器的开发,现在接发数据基本上正常,但是还是有问题。问题如下:
1.客户端与服务器是长连接的,1秒给服务器一条数据如果30秒内没有往服务器发送数据服务器会自动把客户端断开,问题是客户端发送数据很正常的时候就莫名其妙的断开了,我服务器这边没有捕获到任何我自己打印的异常
2.服务器会每30秒向各个客户端回复一条确认消息,回复是很正常,但是回复的消息本来应该回复给A的,却莫名其妙的给了B。
3.客户端发送的数据过长的时候,比如有4000多个字节,服务器读消息有的读的消息是对的,有的读着读着就读成空字符了,比如:
A123|4101|15386|……省略N个字符|1|……此处省略的全是空字符|,用编辑器打开就是口子型的乱码  (4010表示消息长度)这个问题困扰了我2个多月了,一直找不到问题的关键所在,到底是客户端的问题还是我服务器的问题,我也编写了客户端做过测试了,我自己编写的客户端只有问题2存在希望有经验的大手门指点指点,到底是哪里的问题。
进一步解决问题可以联系我,,拜托!!

解决方案 »

  1.   

    我前段时间写了个android的客户端的,服务器是C++做的,好像是有些东西要注意,晚上再看看
      

  2.   

    有些数据类型需要转码的好像,字符串类型的也要转码,给你段代码你参考一下
    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解析到消息不是发给他的,那也没必要读消息
      

  3.   

    楼上的真是不懂啊,哪能用GBK啊,晕死要是C++跟java通信的话最好用ASCii码,这个不会出现乱码的这个原理是网络的字节序不一样,特别是数字的
      

  4.   

    我曾经 遇到过这个问题,对于 读取大包时出现空字符问题.也是java与C++联调时候出现的,后来用了一个方法解决。你的这个问题,应该是两边对socket流读写,没有异步而导致的。