java - Netty 服务器事件

标签 java asynchronous netty

我正在尝试在 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 Event 中的代码不起作用,但如果我先发送然后从 channel 缓冲区读取,它的工作正常。无论如何,我是否首先读取并执行一些长时间操作,然后在完成该处理后,我将响应发送回客户端。我是一个 Java 新手,请引导我正确的方向,我也阅读了文档和一些教程,但我仍然想知道!

最佳答案

这是 netty3 的聊天应用程序示例和 netty4 .

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

关于java - Netty 服务器事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16257799/

相关文章:

java - Netty 和预定执行器服务

java - RandomAccessFile 字节顺序问题

javascript - asnyc() 不会在 ssh 和 mongoose 中的代码末尾退出

sockets - Netty是否支持通过UNIX域套接字的数据报包?

javascript - 简单的 Node.js 应用程序控制流程

c# - 使用 C# 5 异步等待在多个游戏帧上执行的内容

java - 使用 Lets Encrypt SSL 证书保护 Netty 服务器

java - 如何生成 2 个 1 到 7 之间的随机整数,且两者都不为 5?

java - 无法运行具有 2 个或更多设置参数的更新操作的命名查询

java - 如何设置 Jackson 反序列化以将 Base64 编码的字符串转换为 Controller 内的对象