解决方案 »

  1. php 与 C++ 的json encode是不同的,这里要处理一下。
      

  2. php  将收取到的所有数据都做个日志方便调试.先确认是否没有收到信息
      

  3. 我还没有做json的解析,现在只是想把json串整个弄下来,但是也出不来
      

  4. $out = socket_read($socket,8192)  我要是将这句8192改成1的话就能读出9个字符,但是读不全
      

  5. 找到了socket_read 的错误,但是没有错误提示。有没有和socket_read功能类似的函数?socket_recv我也试过。。不行
      

  6. while( ($out = socket_read($socket,8192))!== false){
    }
    这里先去掉因为读到空格字符的因素
      

  7. while(true) {
      $out = socket_read($socket,8192);socket_read 会返回收到的任何数据,包括空串
    因此你不要不断的去读,而不是读一次就结束当然由于循环变成了死循环后,你需要做一个跳出循环的约定
      

  8. 恩,我作了跳出循环的约定,就是要把socket_read($socket,8192)改成socket_read($socket,1)才能读,而且读的支离破碎,请这到底是为什么。
      

  9. 你没有明白我的意思!
    socket_read 是不能作为循环终止的条件的
    比如 while(socket_read($socket,1)),一旦读到 php 认为是“空”的字符(empty 返回真的那些字符)时就会终止循环,造成数据不全
    而 while(socket_read($socket,8192)) 时,如果一直没有收到终止符 \0、\r、\n 则永远停在等待输入的情况下
    当然也有可能一开始就读到上一轮剩余的空字符,而根本进不了循环体既然你在循环结束后有 echo "关闭SOCKET...\n";
    不妨改作 echo "$out 关闭SOCKET...\n";
    看看能输出什么
      

  10. 我明白你的意思,我把代码改成了这样,但是就像我说的,只有$out=socket_read($socket,1);才行,如果$out=socket_read($socket,8192)就是死循环,一直等待,什么都输出不了。。即使之前的那些输出信息也是输出不了的
    do {
    $out=socket_read($socket,1);
    $data.=$out;
    }while(true);
    echo $data;
      

  11. do {
    $out=socket_read($socket,8192);
    if($out=="E") break;
    $data.=$out;
    }while(true);
    echo $data;
    刚才代码粘错了,应该是这样的,我在服务端加了一个字符串最后加了字母E
      

  12. 那不就是 如果一直没有收到终止符 \0、\r、\n 则永远停在等待输入 的情况了
    这说明服务端没有发送结束符(也就是没有遵守约定)
    你也只能连接 socket_read($socket,1) 的结果了
    其实读一块和读一个字节的效率是一样的(都是从输入缓冲区读的)
      

类似问题 »