我正在尝试使用Netty进行初步操作,为此我编写了一个简单的Netty服务器和一个基于oio普通TCP的简单客户端。
客户端发送随机文本数据包,并且必须接收到“Ack”消息。 请参见处理程序方法:
问题是 - 当我尝试发送回“Ack”字符串时,客户端什么都没有收到。 但是当我尝试发送回已接收的消息时,它可以正常工作,并且我可以在客户端看到回声。
也许这不是最优秀的解决方案,但它作为一个例子是可行的。
客户端发送随机文本数据包,并且必须接收到“Ack”消息。 请参见处理程序方法:
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ctx.write("Ack");
ctx.flush();
ByteBuf in = (ByteBuf) msg;
StringBuilder sb = new StringBuilder();
try {
while (in.isReadable()) {
sb.append((char) in.readByte());
}
} finally {
ReferenceCountUtil.release(msg);
}
LOG.debug("Incoming message. ACK was send");
String myaddr = ctx.channel().remoteAddress().toString();
String message = "Message from " + myaddr + " :" + sb.toString();
LOG.debug(message);
sendToOther(myaddr, message);
}
问题是 - 当我尝试发送回“Ack”字符串时,客户端什么都没有收到。 但是当我尝试发送回已接收的消息时,它可以正常工作,并且我可以在客户端看到回声。
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ctx.write(msg);
ctx.flush();
write()
方法需要Object
,我尝试发送(Object) String
- 但什么也没有发生。
我还尝试发送ByteBuf
(在一篇文章中看到),但仍然不起作用。
当我将传入的消息作为回声发送回去时,它可以正常工作。但是当我发送其他东西时,它就无法正常工作。请帮帮我,我无法弄清楚我的错误在哪里。
我解决了这个问题。关键是,你只需要发送ByteBuff
。因此我们需要创建它,并将一些内容写入它,只有这样,我们才能将其写入通道管道。在我的情况下,它是这样的:
String ack = "ACK";
ByteBuf out = ctx.alloc().buffer(ack.length()*2);
out.writeBytes(ack.getBytes());
ctx.write(out);
ctx.flush();
LOG.debug("Incoming message. ACK was send");
也许这不是最优秀的解决方案,但它作为一个例子是可行的。