【发布时间】:2018-11-13 16:40:30
【问题描述】:
我正在尝试构建一个实时应用程序,一次发送和接收分配的信息。我已经设法让 Vertx 套接字服务器和客户端正常工作,但我面临一个问题。当我有大量数据要一次写入大约 1000 条记录时,缓冲区似乎读取速度太快,并且部分读取了当前消息之前的消息,例如,如果我发送两条消息
消息 1“你好世界”
消息 2“我在这里”
然后套接字将接收
“Hello worldI am”,然后它会收到“here”
但它应该单独接收这些字符串。我如何强制套接字一次只接收一条消息,就像 HTTP 客户端使用其 request.bodyHandler 方法一样。对此的任何帮助将不胜感激。
这是我的服务器代码
NetServerOptions options = new NetServerOptions();
options.setReceiveBufferSize(max_buffer_size);
options.setSendBufferSize(max_buffer_size);
NetServer server = vertx.createNetServer(options);
server.exceptionHandler(e -> {
Debug.log("Client exception " +e.toString());
});
server.connectHandler(socket -> {
socket.exceptionHandler(e -> {
Debug.log("Client socket exception " + e.toString());
});
String host = socket.localAddress().host();
Buffer totalBuffer = Buffer.buffer();
socket.handler(buffer -> {
Debug.log("data ::" + buffer.toString());
final RecordParser parser = RecordParser.newDelimited(delemeter, h -> {
Debug.log("data SPLIT ::::::::" + h.toString());
handler.HandleUpdate(h.toString(), socket);
});
parser.handle(buffer);
});
});
这是我的客户端代码:
NetClientOptions options = new NetClientOptions()
.setConnectTimeout(this.connection_timeout)
.setReconnectAttempts(this.connection_attempts)
.setReconnectInterval(this.connection_reconnect_delay)
.setReceiveBufferSize(max_buffer_size)
.setSendBufferSize(max_buffer_size);
NetClient client = this.vertx.createNetClient(options);
client.connect(this.port, ip, res -> {
if (res.succeeded()) {
System.out.println("Connected!");
this.client_socket = res.result();
Buffer totalBuffer = Buffer.buffer();
this.client_socket.handler(buffer -> {
Debug.log("data ::" +buffer.toString());
handler.HandleUpdate(buffer.toString(), null);
});
} else {
System.out.println("Failed to connect: " + res.cause().getMessage());
}
});
【问题讨论】:
-
欢迎来到 Stack Overflow - 很高兴有你。请阅读 How do I ask a good question? 和 How to create a Minimal, Complete, and Verifiable example 以帮助将 Stack Overflows 内容保持在尽可能高的水平,并增加获得适当答案的机会。
-
所以我最终决定不再使用 vertx,因为我无法解决问题。如果有人知道如何解决这个问题,我仍然会感谢对未来项目的帮助。