Asp*_*lis 5 java sockets jboss network-programming netty
我正在尝试使用Netty的第一步,为此我在Net上编写了简单的服务器,在oio plain TCP上编写了简单的客户端.
客户端发送随机文本包,并且必须接收"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);
}
Run Code Online (Sandbox Code Playgroud)
问题是 - 当我尝试发回"Ack"字符串时 - 客户端什么也得不到.但是当我尝试发回传入消息时 - 它工作正常,我在客户端看到回声.
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
ctx.write(msg);
ctx.flush();
Run Code Online (Sandbox Code Playgroud)
write()方法需要Object,我试图发送(Object)String - 但没有任何反应.我也尝试发送ByteBuf(我在一篇文章中看到过)并且它仍然没有工作.
当我发送传入的消息作为回声 - 它的工作原理.当我发送其他东西时 - 它没有.请帮帮我,我无法弄清楚我的错误在哪里.
我解决了这个问题.要点是,你只需要发送ByteBuff.所以我们需要创建它,并为它写一些东西,然后才能将它写入chanel管道.就我而言,它就像:
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");
Run Code Online (Sandbox Code Playgroud)
可能这不是特有的溶剂,但它可以作为例子.
Moh*_*-Aw 19
如果你更换你的,你会看到它失败的原因
ctx.write("Ack");
ctx.flush();
Run Code Online (Sandbox Code Playgroud)
在您的serverHandler中,具有以下内容:
ChannelFuture cf = ctx.write("Ack");
ctx.flush();
if (!cf.isSuccess()) {
System.out.println("Send failed: " + cf.cause());
}
Run Code Online (Sandbox Code Playgroud)
它应该给你一条消息说不String支持.
ByteBuf 应该工作:
ctx.write(Unpooled.copiedBuffer("Ack", CharsetUtil.UTF_8));
ctx.flush();
Run Code Online (Sandbox Code Playgroud)
在客户端编辑channelRead方法:
ByteBuf in = (ByteBuf) msg;
System.out.println("Client received: " + in.toString(CharsetUtil.UTF_8));
Run Code Online (Sandbox Code Playgroud)