我正在尝试与使用 DataInputStream.readUTF 和 DataOutputStream.writeUTF 的服务器通信。
我做了通常的引导代码来设置我的客户端,并设置了以下 pipelinefactory
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
return Channels.pipeline(
new LengthFieldBasedFrameDecoder(65536, 0, 2),
new StringDecoder(CharsetUtil.UTF_8),
new StringEncoder(CharsetUtil.UTF_8),
new MyClientHandler());
}
});
在扩展 SimpleChannelUpstreamHandler 的 MyClientHandler 中,我有以下内容:
boolean sent = false; //is this thread safe?
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
logger.log(Level.INFO, e.getMessage().toString());
e.getChannel().write("Hello over there!");
if(!sent){
//do something and set sent
}
}
我设法成功地从服务器接收消息,但服务器没有收到我的“你好,那边”消息。不确定我可能忽略了什么。
另外,注意发送的 boolean 值,我可以添加这样的字段并使用它们而不用担心线程问题吗?
最佳答案
- 我设法成功地从服务器接收消息,但服务器没有收到我的“你好,那边”消息。不确定我可能忽略了什么。
由于可以使用 LengthFieldBasedFrameDecoder 接收来自服务器的消息,因此该消息具有长度字段。
+--------+----------+
| Length | Message |
+--------+----------+
因此,服务器有可能期望收到的消息具有长度字段。 length域如果这样写怎么办?
+--------+---------------------+
| 0x0011 | "Hello over there!" |
+--------+---------------------+
[样本]
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
logger.log(Level.INFO, e.getMessage().toString());
byte[] message = "Hello over there!".getBytes("UTF-8");
ChannelBuffer buf = ChannelBuffers.buffer(message.length + 2);
buf.clear();
short len = (short)message.length;
buf.writeShort(len);
buf.writeBytes(message);
e.getChannel().write(buf);
if(!sent){
//do something and set sent
}
}
- 另外,请注意发送的 boolean 值,我可以添加此类字段并使用它们而不用担心线程问题吗?
是的,您可以添加字段来存储一些状态。 而且你不需要考虑线程的同步。
关于java - 当另一方使用 readUTF/writeUTF 时如何用 netty 读/写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787286/