Java> PHP Socket - 消息开头的垃圾

时间:2014-03-10 11:02:41

标签: java php sockets

我有一个java服务器与从apache调用的PHP脚本进行通信。我的目标是在请求时从java服务器向php客户端发送一个JSON,但是当它在客户端收到时会有一些东西被加上前缀。

JAVA

in = new BufferedReader(new InputStreamReader (socket.getInputStream()));                  
out= new DataOutputStream(socket.getOutputStream());

//The server receives a JSON from the PHP script and replies. It recives and converts to a Gson JSON no problem.

String reply = "{\"status\":\"reg\",\"token\":\""+client.getToken()+"\"}\r\n";
//reply = "HELLO\r";
out.writeUTF(reply);

PHP

$rec = socket_read($socket, 2048,PHP_NORMAL_READ);
echo "Receiving... ";
echo $rec;

问题是收到的消息是用一些废话预先修复的。

PHP输出

  

接收...... 1 {“状态”:“reg”,“令牌”:“QOPIPCNDI4K97QP0NAQF”}

如果我发送“HELLO \ r”

  

接收......> HELLO

1 个答案:

答案 0 :(得分:2)

除非您使用DataOutputStream.writeUTF()阅读邮件,否则不应使用DataOutputStream.readUTF()

以下是writeUTF()

的javadoc的片段
  

使用修改后的UTF-8将字符串写入基础输出流   以与机器无关的方式进行编码。

     

首先,将两个字节写入输出流,就好像通过   writeShort方法给出要遵循的字节数。这个值是   实际写出的字节数,而不是长度   串。在长度之后,输出字符串的每个字符,   按顺序,使用修改后的UTF-8编码作为字符。如果   抛出没有异常,写入的计数器增加了   写入输出流的总字节数。这将是   至少两加上str的长度,最多加两次加三次   str的长度。

上面的粗体部分可能会告诉您为什么在消息开头会出现奇怪的字符。

以下是我认为适用于您案例的解决方法

BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
out.write(os.getBytes("UTF-8"));

参考:Why does DataOutputStream.writeUTF() add additional 2 bytes at the beginning?