5
我試圖用Netty做我的第一步,爲此我在Netty上寫了簡單的服務器,並在oio普通TCP上寫了簡單的客戶端。Netty channel.write不寫信息
客戶端發送隨機文本包,並且必須收到「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);
}
的問題是 - 當我嘗試發送回「確認」串 - 客戶端收到沒有。 但是,當我嘗試發回消息傳入 - 它工作正常,並且我在客戶端看到回聲。 ()方法需要對象,我試圖發送(對象)字符串 - 但沒有任何事情發生。 我也嘗試發送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");
可能是這不是exelent溶劑,但它作爲例子。
感謝名單的回答!你的解決方案比我發現自己更好。 – Asprelis 2014-09-10 09:46:11