2

文字列を送受信するためにいくつかの例を使用しましたが、それらは完全に機能しました。問題は、シリアル化可能なオブジェクトを送信するようにコードを (API と例を読んで) 適応させようとしたが、それらが機能しないことです。エラーメッセージは表示されません。チャネルの読み取りメソッドは呼び出されないため、サーバーはメッセージを取得しません。ある種の区切り記号に関連している可能性があると読みましたが、それに関する手がかりが見つかりません

これがコードです。機能するため、追加および削除されたハンドラーは含めません

サーバーイニシャライザー

protected void initChannel(SocketChannel arg0) throws Exception {
    ChannelPipeline pipeline = arg0.pipeline();
    pipeline.addLast("decoder", new ObjectDecoder(null));
    pipeline.addLast("encoder", new ObjectEncoder());
    pipeline.addLast("handler", new ChatServerHandler());
}

チャネル読み取り

public void channelRead0(ChannelHandlerContext arg0, Message message)
        throws Exception {
    Channel incoming = arg0.channel();
    System.out.println("received "+ message.getContent() + "from " + message.getSender() + "\r\n" );            

}

サーバーを実行する

public void run() throws InterruptedException{
    EventLoopGroup bossGroup = new NioEventLoopGroup();
    EventLoopGroup workerGroup = new NioEventLoopGroup();

    try{
        ServerBootstrap bootstrap = new ServerBootstrap()
        .group(bossGroup, workerGroup)
        .channel(NioServerSocketChannel.class)
        .childHandler(new ChatServerInitializer());         
        bootstrap.bind(port).sync().channel().closeFuture().sync();

    }

そして、これがクライアントです

protected void initChannel(SocketChannel arg0) throws Exception {
    ChannelPipeline pipeline = arg0.pipeline();


    pipeline.addLast("decoder", new ObjectDecoder(null));
    pipeline.addLast("encoder", new ObjectEncoder());
    pipeline.addLast("handler", new ChatClientHandler());

}

そしてメイン(サーバーはクライアントが接続されていると言います)

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

            Channel channel = bootstrap.connect(host,port).sync().channel();
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
            Message message = new Message();
            message.setReceiver("user");
            message.setSender("user 2");
                    try {
                        message.setContent(in.readLine());

                        channel.write(message);

                        System.out.println("Sent " + System.currentTimeMillis());
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

最後に、get/set のないメッセージ クラス

public class Message implements Serializable {

private static final long serialVersionUID = 1L;
private String sender;
private String receiver;
private String content;
public Message(String sender, String receiver, String content){     
    this.setSender(sender);
    this.setReceiver(receiver);
    this.setContent(content);       
}

お時間をいただきありがとうございました

4

1 に答える 1

1

書き込み操作から返された ChannelFuture を確認します。失敗したに違いない。

于 2013-09-10T05:55:24.287 に答える