【发布时间】:2018-07-02 14:07:46
【问题描述】:
我正在尝试根据我必须使用的现有基础架构模拟 TCP 服务器以使用 Vertx 进行测试。
我正在模仿的服务器完全异步工作,并且根据缓冲区中指示请求长度的前标头知道传入缓冲区的长度。
我需要在连接到我的模拟 TCP 服务器的每个客户端套接字上读取传入请求的前 6 个字符。从这个 pre-header 中我读取了请求的实际长度(例如,对于 xx3018,我知道请求的全长是 3018)。
然后我需要根据长度读取缓冲区的其余部分,将其与响应映射匹配,并为请求返回正确的响应。
使用纯 java 的工作模拟服务器示例(快速实现,因此不会阻止其他开发:))
public void run(String... args) throws Exception {
log.info("Starting TCP Server");
ServerSocket serverSocket = new ServerSocket(1750);
while (true) {
try {
Socket socket = serverSocket.accept();
CompletableFuture.runAsync(() -> {
Exception e = null;
while (e == null) {
try {
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
byte[] preHeader = new byte[6];
inputStream.read(preHeader);
String preHeaderValue = new String(preHeader);
log.info("Pre header: {}", preHeaderValue);
int length = Integer.valueOf(preHeaderValue.substring(2));
log.info("Request full length: {}", length);
byte[] request = new byte[length - 6];
inputStream.read(request);
String requestValue = new String(request);
log.info("Request: {}", requestValue);
String response = this.requestResponseProvider.getResponse(preHeaderValue + requestValue);
log.info("Response: {}", response);
outputStream.write(response.getBytes());
} catch (Exception ex) {
log.error("Encountered a problem: {}", e.getMessage());
e = ex;
}
}
});
} catch (Exception e) {
log.error("Encountered a problem: {}", e.getMessage());
}
}
}
我似乎找不到一种方法来控制输入流,就像我用普通 java 控制它一样。
【问题讨论】: