各位,现在用java和c实现socket编程,服务端用Java,客户端使用C实现。在客户端发送给服务端消息时,服务端BufferedReader的readLine()方法读取,第一次可以正确读出消息,并通过PrintWriter的pw.print("123\n");返回给客户端,客户端也能正确收到。问题是当客户端第二次(第三次,第四次也是这样)发送消息时,服务端再用readLine()方法读取时,总是在消息前面出现几个'\u0000',不知道什么原因,清各位高手指点一下。客户端的发送程序应该没有什么问题,在c的数组后加了'\n'。我怀疑是不是C和java的readLine()方法之间有一些问题,但是又没有经验,麻烦各位指教,项目很急!

解决方案 »

  1.   

    你用的是什么协议?
    这个跟协议有关,跟C/C++还是Java没有关系
    C++的客户端和Java的服务器端都能通信的。
      

  2.   

    用的是socket,协议是自己定义的报文格式!顶,大家帮忙啊
      

  3.   

    建议不要用BufferedReader去读数据,,用DataOutputStream 去读写,在字符和字节之间装换要好一点,还有,,java和c虽然都是采用Socket通信,但不同方法其具体实现是不同,,双方都用字节来进行进行输入输出要好点,,
      

  4.   

    我猜测的,c的字符窜都是 \0 结束的c发送 abcd\r\n\0efghi\r\n\0jkuiop\r\n\0java readline是按照换行符这些分割的, 所以如楼上说的,你发到包两边换下自定协议head+body, 规定每段的长度去读取
      

  5.   

    C 里面字符串是以\0结尾的
    可能某个字符串后面跟了N个\0\0\0\0,因此第二次readLine的时候就把前面的0给读进来了
    应该是c客户端写入字符串的代码有问题
      

  6.   


    不是N个\0,一个\0就够了,对java来讲,就要转成UNICODE的\u0000
      

  7.   

    那个C事用单片机作的,具体内部是否自动加了\0也不知道,也不知道在什么位置加的。后来搞了一个变通的方法,readLine()之后再trim()一下好像暂时可以用了。先这样吧,再等两天看看能不能彻底搞定再结贴!
      

  8.   

    建议不要用readLine()通信,C和Java之间通用的数据还是用byte来读比较好
    \u0000在Unicode中应该是空格,也许是发送串自己填充的,联想到C/C++的字符串char*都是用\0结束的,这样也许就能理解为什么了
      

  9.   

    字符编码格式问题,如果找不到的话先用REPLACE()先解决一下。。方法总是有,关键是你要怎么用。。
      

  10.   

    c++的readLine也是这样  这是文件流的结束标记!
    所以你要判断文件是否有结束,如果结束就不进行读取c++中的是: while(!input.eof()){
      input.readline();
    }java :
    while(fileLine=file.ReadLine())!=nul)
    c 则是: while(!feof(input)){
    }