Netty channelRead从未打过电话

时间:2014-01-24 13:59:17

标签: java netty channel

我玩过netty并跟随视频(https://www.youtube.com/watch?v=tsz-assb1X8)来构建聊天服务器和客户端服务器正常工作(我使用telnet进行测试,这里有效)但是客户端没有重现数据。从未调用ChatClinetHandler.java中的channelRead方法,但调用了channelReadComplete。

ChatClient.java

import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ChatClient {

    public static void main(String args[]) {
        try {
            new ChatClient(new InetSocketAddress("localhost", 8000)).run();
        } catch (Exception ex) {
            Logger.getLogger(ChatClient.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    private final InetSocketAddress server;

    public ChatClient(InetSocketAddress server) {
        this.server = server;
    }

    public void run() throws Exception {
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap bootstrap = new Bootstrap()
                    .group(group)
                    .channel(NioSocketChannel.class)
                    .handler(new ChatClientInitializer());

            Channel channel = bootstrap.connect(server).sync().channel();
            System.out.println("Connected to Server: " + server.toString());
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            while (channel.isActive()) {
                String userMessage = in.readLine();
                channel.writeAndFlush(userMessage + "\r\n");
                if (userMessage.equalsIgnoreCase("bye")) {
                      group.shutdownGracefully();
                      break;
                }

            }
        } finally {
            group.shutdownGracefully();
        }
    }
}

ChatClientInitializer.java

import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelPipeline; import io.netty.channel.socket.SocketChannel; import io.netty.handler.codec.DelimiterBasedFrameDecoder; import io.netty.handler.codec.Delimiters; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder;

public class ChatClientInitializer extends ChannelInitializer<SocketChannel> {

    @Override
    protected void initChannel(SocketChannel c) throws Exception {
        ChannelPipeline pipeline = c.pipeline();
        pipeline.addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
        pipeline.addLast(new StringDecoder());
        pipeline.addLast(new StringEncoder());
        pipeline.addLast(new ChatClientHandler());
    } }

ChatClinetHandler.java

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;


public class ChatClientHandler extends ChannelInboundHandlerAdapter {
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println(msg.toString());
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx,
            Throwable cause) {
        cause.printStackTrace();
    }

}

2 个答案:

答案 0 :(得分:0)

对不起我的错误我忘记发送每封邮件的“\ r \ n”。

答案 1 :(得分:0)

Although shim_ claims to have determined that the problem is not sending "\r\n" with each message, I see the need to provide a clarification here.

In ChatClientInitializer.java you see a handler named framer which is a DelimiterBasedFrameDecoder object with a line delimiter in that specific example (More info on DelimiterBasedFrameDecoder can be found here).

So, that means the client is expecting messages that ends with "\r\n" on that specific channel. If a message not ending with "\r\n" is received, then the channelRead() method will not be provoked.