0

我正在尝试在 Netty 中实现一个基本的多客户端聊天,我被困在某一点上!代码是:

public class Server {

public static void main(String[] args) throws Exception {
    ChannelFactory factory =
        new NioServerSocketChannelFactory(
                Executors.newCachedThreadPool(),
                Executors.newCachedThreadPool());

    ServerBootstrap bootstrap = new ServerBootstrap(factory);

    bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
        public ChannelPipeline getPipeline() {
            return Channels.pipeline(new ServerHandler());
        }
    });

    bootstrap.setOption("child.tcpNoDelay", true);
    bootstrap.setOption("child.keepAlive", true);

    bootstrap.bind(new InetSocketAddress(8888));
}

}

public class ServerHandler extends SimpleChannelHandler {

@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
        ChannelBuffer buf = (ChannelBuffer) e.getMessage();
        Channel ch=e.getChannel();
        while(buf.readable()) {
            System.out.println((char) buf.readByte());
            System.out.flush();
        }
        ch.write(e.getMessage());
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
    e.getCause().printStackTrace();

    Channel ch = e.getChannel();
    ch.close();
}

}

我想先阅读消息然后发送/处理它!但是 messageReceived 事件中的代码不起作用,当我第一次读取然后处理消息时,但如果我先发送然后从通道缓冲区读取,它工作正常。无论如何,我首先阅读并执行一些长时间的操作,然后在完成该处理后将响应发送回客户端。我是 Java 新手,请引导我正确的方向,我也阅读了文档和一些教程,但我仍然想知道!

4

2 回答 2

1

这是netty3netty4的示例聊天应用程序。

此外,对于聊天客户端,您似乎正在使用服务器端类:NioServerSocketChannelFactory. 我认为你需要NioClientSocketChannelFactory.

于 2013-04-29T00:09:03.070 回答
0

我怀疑问题是从缓冲区读取会改变缓冲区的读取索引。当您将缓冲区写入通道时,读取索引位于数据的末尾。有几个选项

  • 使用 readableBytes() 确定可读字节数,然后使用 getByte(index) 检索字节而不更改读取索引。
  • 在读取循环中的字节之前和之后使用 markReaderIndex 和 resetReaderIndex
  • 使用 buffer.duplicate 获取共享底层数据但管理单独的读/写索引的缓冲区。

有关更多信息,请参阅ChannelBuffer (Netty 3)。

于 2013-04-29T10:22:47.733 回答