当前位置: 首页 > 知识库问答 >
问题:

Netty服务器事件

梁晋鹏
2023-03-14

我正在尝试在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();
}

}

我想先读一下留言

共有2个答案

慎志国
2023-03-14

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

  • 使用readableBytes()确定可读字节数,然后使用getByte(索引)检索字节而不更改读取索引
  • 在读取循环中的字节前后使用markReaderIndex和resetReaderIndex
  • 使用缓冲区。复制以获取共享基础数据但管理separeat读/写索引的缓冲区

有关详细信息,请参阅ChannelBuffer(Netty 3)。

翟俊哲
2023-03-14

下面是netty3和netty4的聊天应用程序示例。

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

 类似资料:
  • 我有一个基于UDP网络的服务器。它有一个流水线,我在其中重写方法。 我需要时不时地写些信息。我只能通过使用中的套接字信息和中的通道来实现。为了能够重用这些信息,我保留在一个静态映射中。 我做错什么了吗? 有没有比将通道和远程地址保留在某个成员中更好的回写方法?

  • 我已经阅读了netty代理服务器示例。但是,我想知道如何实现一个与代理对话的客户端。我正在实现的解决方案是服务器,每当客户端连接到服务器时,它都需要连接到套接字服务器。因此,连接到服务器的每个客户端都能够从另一台服务器发送/接收数据。 我需要帮助用netty实现这样的体系结构,因为服务器端是在netty上构建的。

  • 我试图建立一个通用服务器总是在连接的客户端。 该体系结构由4个主要组件组成 有状态应用服务器 无状态网关服务器 客户排队 系统和经纪人 工艺流程 客户端连接到网关 我正在使用JavaNetty作为网关。appserver也是用Java编写的。 我很想说这个设计像Mongrel2,但我不能完全确定。我想说,这更符合城市飞艇氦边缘服务器的设计(http://urbanairship.com/blog/

  • 我希望netty服务器A在启动时连接netty服务器B,听起来像代理,所以我尝试了netty代理示例,但它只是在中启动netty客户端,只有一个新的连接处于活动状态,客户端才会被创建。当服务器A启动时,我需要通知服务器B做一些“注册”的事情,我该怎么办?

  • 主要内容:编写时间客户端本教程中实现的协议是TIME协议。 它与先前的示例不同,时间服务器只发送包含位整数的消息,而不接收任何请求,并在消息发送后关闭连接。 在本示例中,您将学习如何构造和发送消息,以及在完成时关闭连接。 因为时间服务器将忽略任何接收到的数据,但是一旦建立连接就发送消息,所以我们不能使用方法。而是覆盖方法。 以下是代码的实现: 下面我们来看看上面代码的一些解释分析: 如上所述,当建立连接并准备好生成流量时

  • Netty服务器,Fedora。我只是无法从远程主机连接到服务器,并且通过util没有显示监听套接字。但是我可以在同一台机器上建立运行客户端和服务器的连接。就像这样: 我已尝试仅使用端口、localhost IP、0.0.0.0 IP和网络IP初始化