2013-09-09 3 views
2

Я использовал несколько примеров для отправки и получения строк, и они отлично работали. Дело в том, что я попытался адаптировать код (чтение 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);  
} 

Спасибо лот за ваше время

ответ

1

Проверьте ChannelFuture, возвращенный из операции записи. Держу пари, что это провалилось.

+0

Вы правы, это сработало. Есть ли у вас какая-либо информация о том, почему это произойдет? я думаю, что я пишу его правильным способом, а метод причины бросает нуль –

+0

, если он был провален, должен быть Throwable. Можете ли вы показать стек? –

+0

это ничего не бросит, или я не знаю, как правильно его поймать. Я пытаюсь поймать любое исключение, и он ничего не поймает. Также я прошу isDone(), и он говорит false, поэтому, возможно, именно по этой причине я не получаю никаких исключений. Заранее спасибо –