我有一个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
答案 0 :(得分:2)
除非您使用DataOutputStream.writeUTF()
阅读邮件,否则不应使用DataOutputStream.readUTF()
。
以下是writeUTF()
:
使用修改后的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?