缓冲区与 TCP Vert.x 服务器中的另一个缓冲区合并
Buffer is merged with another Buffer in TCP Vert.x server
我想通过 TCP 向服务器发送命令。我创建了检索 Buffers
消息的服务器。在客户端中,我发送了 10 个命令。我不知道为什么服务器以不可预测的方式读取 Buffer
。
服务器:
@Slf4j
public class TcpServ {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
NetServer server = vertx.createNetServer();
server.connectHandler(socket -> {
log.debug("New connection established with: socket address {}", socket.remoteAddress());
socket.handler(new MyHandler());
socket.closeHandler(v -> {
log.debug("The socket has been closed.");
});
});
server.listen(8088, "localhost", netServerAsyncResult -> {
if (netServerAsyncResult.succeeded()) {
log.debug("Server is now listening on actual port: " + server.actualPort());
} else {
log.debug("Failed to bind!");
}
});
}
@Slf4j
static class MyHandler implements Handler<Buffer> {
@Override
public void handle(Buffer event) {
byte[] bytes = event.getBytes();
log.debug("Received data: {}", new String(bytes));
}
}
}
客户:
@Slf4j
public class TcpClie {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
NetClient client = vertx.createNetClient();
client.connect(8088, "localhost", netSocketAsyncResult -> {
log.debug("Connection established.");
NetSocket socket = netSocketAsyncResult.result();
for (int j = 0; j < 10; j++) {
String s = "Command" + j;
Buffer b = Buffer.buffer(s.getBytes());
socket.write(b);
}
log.debug("Data sent.");
socket.handler(buffer -> {
log.debug("Recived data from server with size: " + buffer.length());
});
});
}
}
我得到的是一次:
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command0Command1Command2Command3Command4Command5Command6Command7Command8Command9
另一次是:
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command0
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command1
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command2
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command3
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command4Command5
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command6Command7
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command8
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command9
我期望的是每次使用 socket.write()
服务器接收 Buffer
。
预期输出应为:
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command0
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command1
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command2
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command3
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command4
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command5
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command6
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command7
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command8
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command9
这不是错误。 TCP 是一个低级协议,它没有像 HTTP 那样定义什么是 request 或 command。
您必须在 TCP 之上定义您自己的应用程序协议,这可以像在它们之间添加换行符 \n
字符一样简单,或者为所有命令设置固定的缓冲区大小。
在服务器端,您可以使用 Vert.x RecordParser
:
RecordParser parser = RecordParser.newDelimited("\n", h -> {
System.out.println(h.toString());
});
parser.handle(Buffer.buffer("command0\ncomma"));
parser.handle(Buffer.buffer("nd1\nco"));
parser.handle(Buffer.buffer("mmand2"));
将导致:
command0
command1
command2
我想通过 TCP 向服务器发送命令。我创建了检索 Buffers
消息的服务器。在客户端中,我发送了 10 个命令。我不知道为什么服务器以不可预测的方式读取 Buffer
。
服务器:
@Slf4j
public class TcpServ {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
NetServer server = vertx.createNetServer();
server.connectHandler(socket -> {
log.debug("New connection established with: socket address {}", socket.remoteAddress());
socket.handler(new MyHandler());
socket.closeHandler(v -> {
log.debug("The socket has been closed.");
});
});
server.listen(8088, "localhost", netServerAsyncResult -> {
if (netServerAsyncResult.succeeded()) {
log.debug("Server is now listening on actual port: " + server.actualPort());
} else {
log.debug("Failed to bind!");
}
});
}
@Slf4j
static class MyHandler implements Handler<Buffer> {
@Override
public void handle(Buffer event) {
byte[] bytes = event.getBytes();
log.debug("Received data: {}", new String(bytes));
}
}
}
客户:
@Slf4j
public class TcpClie {
public static void main(String[] args) {
Vertx vertx = Vertx.vertx();
NetClient client = vertx.createNetClient();
client.connect(8088, "localhost", netSocketAsyncResult -> {
log.debug("Connection established.");
NetSocket socket = netSocketAsyncResult.result();
for (int j = 0; j < 10; j++) {
String s = "Command" + j;
Buffer b = Buffer.buffer(s.getBytes());
socket.write(b);
}
log.debug("Data sent.");
socket.handler(buffer -> {
log.debug("Recived data from server with size: " + buffer.length());
});
});
}
}
我得到的是一次:
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command0Command1Command2Command3Command4Command5Command6Command7Command8Command9
另一次是:
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command0
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command1
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command2
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command3
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command4Command5
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command6Command7
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command8
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command9
我期望的是每次使用 socket.write()
服务器接收 Buffer
。
预期输出应为:
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command0
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command1
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command2
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command3
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command4
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command5
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command6
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command7
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command8
[vert.x-eventloop-thread-1] DEBUG TcpServ$MyHandler - Received data: Command9
这不是错误。 TCP 是一个低级协议,它没有像 HTTP 那样定义什么是 request 或 command。
您必须在 TCP 之上定义您自己的应用程序协议,这可以像在它们之间添加换行符 \n
字符一样简单,或者为所有命令设置固定的缓冲区大小。
在服务器端,您可以使用 Vert.x RecordParser
:
RecordParser parser = RecordParser.newDelimited("\n", h -> {
System.out.println(h.toString());
});
parser.handle(Buffer.buffer("command0\ncomma"));
parser.handle(Buffer.buffer("nd1\nco"));
parser.handle(Buffer.buffer("mmand2"));
将导致:
command0
command1
command2