2013-08-29 2 views
1

Я начал работать с netty и (очевидно) хочу отправлять сообщения между клиентами и сервером. Поскольку я нахожусь на ранней стадии, у меня проблемы с простыми вещами, в этом случае он отправляет сообщение. Это, как я создаю мой сервер и мой клиент:Netty - канал мгновенно закрыт

Client:

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(); 
    } 
} 

Клиент Initializer:

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()); 
    } 
} 

Сервер Initializer:

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. Я отредактировал его части и не понимаю, почему он больше не работает. При выполнении клиента, я получаю только одну строку сообщения об ошибке:

java.nio.channels.ClosedChannelException 

ответ

0

называют только group.shutdownGracefully();, когда вы на самом деле хотите, чтобы выйти из клиента. Если вы удалите эту строку со своего клиента, то Channel останется открытым.

Кроме того, вам нужно всего лишь суффикс \n в конце всех отправленных сообщений.

+0

Это сделал это! Спасибо! : D – user1406177

0

В дополнение к этому, вы можете закрыть канал, как это:

@Override 
    public void channelActive(ChannelHandlerContext ctx) { 
    ctx.channel().pipeline().remove(this); 
    }