Я использовал несколько примеров для отправки и получения строк, и они отлично работали. Дело в том, что я попытался адаптировать код (чтение api и примеров) для отправки сериализуемых объектов, и они не работают. Я не получаю сообщение об ошибке, метод чтения канала никогда не вызывается, поэтому сервер никогда не получает сообщение. Я прочитал это может быть связанно с каким-то разделителями, но я не могу найти ключ относительно егоНе удалось отправить объект с netty
Вот код, я не буду включать в себя добавил обработчик и удален, так как они работают
Сервер initiaizer
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();
}
Последний, класс сообщений без получения/установки
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);
}
Спасибо лот за ваше время
Вы правы, это сработало. Есть ли у вас какая-либо информация о том, почему это произойдет? я думаю, что я пишу его правильным способом, а метод причины бросает нуль –
, если он был провален, должен быть Throwable. Можете ли вы показать стек? –
это ничего не бросит, или я не знаю, как правильно его поймать. Я пытаюсь поймать любое исключение, и он ничего не поймает. Также я прошу isDone(), и он говорит false, поэтому, возможно, именно по этой причине я не получаю никаких исключений. Заранее спасибо –