我想将JSON发送到套接字并使用JavaScript处理它。但不幸的是,JSON-Object并没有完整地发送。对象data
写入输出流后,服务器接收JSON-Object,而不等待后面的任何内容。
如何写入套接字
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("from", from);
jsonGenerator.writeObjectField("data", data);
jsonGenerator.writeEndObject();
服务器处理程序在某一点接收到的内容
{"from":"me","data":{"one":1,"two":2}
可以看到最后一个}
没有写入。如果我要在from
字段之前写入data
对象,服务器将得到以下内容:
{"data":{"one":1,"two":2}
JSON对象的其余部分将被发送,但不是作为一个实体发送,这使得它难以在服务器上解析。
JsonGenerator
是这样创建的
JsonGenerator jsonGenerator = (new JsonFactory()).createGenerator(socket.getOutputStream());
jsonGenerator.setCodec(new ObjectMapper());
我怀疑这与编解码器设置有关。
服务器端是一个简单的NodeJS,记录来自socket的数据。
net.createServer(function(socket) {
socket.on("data", function(data) {
console.log(data.toString());
});
}).listen(8080);
您可以在控制台中看到JSON-Object是通过两个不同的事件发送的。当我试图解析data
进来时,它也会抛出错误,因为一些对象丢失了。
编辑
我注意到有时它会发送整个JSON-Object,但只有20次中的1次,如果有的话。只发送字符串字段和数字字段是完美的。
我发现你必须调用flush()
或close()
,因为它似乎缓冲了一些数据。
From Javadoc for flush()
/**
* Method called to flush any buffered content to the underlying
* target (output stream, writer), and to flush the target itself
* as well.
*/
@Override
public abstract void flush() throws IOException;