文字列を送受信するためにいくつかの例を使用しましたが、それらは完全に機能しました。問題は、シリアル化可能なオブジェクトを送信するようにコードを (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);
}
お時間をいただきありがとうございました