1

私は netty を使い始めましたが、(明らかに) クライアントとサーバーの間でメッセージを送信したいと考えています。私は初期段階なので、単純なことに問題があります。この場合はメッセージの送信です。これは、サーバーとクライアントを作成する方法です。

クライアント:

public void run() throws Exception
{
    EventLoopGroup group = new NioEventLoopGroup();
    try
    {
        Bootstrap b = new Bootstrap();
        b.group(group)
                .channel(NioSocketChannel.class)
                .handler(new SecureChatClientInitializer());
        b.option(ChannelOption.SO_KEEPALIVE, true);

        // Start the connection attempt.
        ChannelFuture future = b.connect(new InetSocketAddress(host, port));
        Channel ch = future.awaitUninterruptibly().channel();
        ch.writeAndFlush("hi\r\n");

        // Wait until all messages are flushed before closing the channel.
        if (lastWriteFuture != null)
        {
            lastWriteFuture.sync();
        }
    } finally
    {
        // The connection is closed automatically on shutdown.
        group.shutdownGracefully();
    }
}

サーバ:

public void run() throws InterruptedException
{
    EventLoopGroup bossGroup = new NioEventLoopGroup();
    EventLoopGroup workerGroup = new NioEventLoopGroup();
    try
    {
        ServerBootstrap b = new ServerBootstrap();
        b.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .childHandler(new SecureChatServerInitializer(sessionManager));
        b.option(ChannelOption.SO_KEEPALIVE, true);
        b.bind(port).sync().channel().closeFuture().sync();

    } finally
    {
        bossGroup.shutdownGracefully();
        workerGroup.shutdownGracefully();
    }
}

クライアント初期化子:

public class SecureChatClientInitializer extends ChannelInitializer<SocketChannel>
{

    @Override
    public void initChannel(SocketChannel ch) throws Exception
    {
           ChannelPipeline pipeline = ch.pipeline();

        SSLEngine engine =
                SecureChatSslContextFactory.getClientContext().createSSLEngine();
        engine.setUseClientMode(true);
        pipeline.addLast("ssl", new SslHandler(engine));
        pipeline.addLast("framer", new DelimiterBasedFrameDecoder(
                8192, Delimiters.lineDelimiter()));
        pipeline.addLast("decoder", new StringDecoder());
        pipeline.addLast("encoder", new StringEncoder());
        pipeline.addLast("handler", new SecureChatClientHandler());
    }
}

サーバー初期化子:

public class SecureChatServerInitializer extends ChannelInitializer<SocketChannel>
{

    ...

    @Override
    public void initChannel(SocketChannel ch) throws Exception
    {
        ChannelPipeline pipeline = ch.pipeline();

        SSLEngine engine =
                SecureChatSslContextFactory.getServerContext().createSSLEngine();
        engine.setUseClientMode(false);
        pipeline.addLast("ssl", new SslHandler(engine));
        pipeline.addLast("framer", new DelimiterBasedFrameDecoder(
                8192, Delimiters.lineDelimiter()));
        pipeline.addLast("decoder", new StringDecoder());
        pipeline.addLast("encoder", new StringEncoder());
        pipeline.addLast("handler", new SecureChatServerHandler(sessionManager));
    }
}

ソースコードを見て推測したように: はい、その一部は SecureChatExample からのものです。一部を編集しましたが、なぜ機能しなくなったのかわかりません。クライアントを実行すると、次の 1 行のエラー メッセージしか表示されません。

java.nio.channels.ClosedChannelException
4

2 に答える 2

0

group.shutdownGracefully();実際にクライアントを終了したい場合にのみ呼び出します。クライアントからその行を削除しても、Channelは開いたままになります。

\nまた、送信するすべてのメッセージの末尾にサフィックスを付けるだけです。

于 2013-08-29T14:40:44.607 に答える