2013-04-27 95 views
0

我想在Netty中实现一个基本的MultiClient聊天,我卡在一个点!该代码是:Netty服务器事件

​​

}

public class ServerHandler extends SimpleChannelHandler { 

@Override 
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { 
     ChannelBuffer buf = (ChannelBuffer) e.getMessage(); 
     Channel ch=e.getChannel(); 
     while(buf.readable()) { 
      System.out.println((char) buf.readByte()); 
      System.out.flush(); 
     } 
     ch.write(e.getMessage()); 
} 

@Override 
public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { 
    e.getCause().printStackTrace(); 

    Channel ch = e.getChannel(); 
    ch.close(); 
} 

}

我首先要阅读信息&然后发送/过程吧!但messageReceived事件中的代码不起作用,当我第一次读取&然后处理该消息,但其工作正常,如果我先发送并从通道缓冲区读取后。有没有我第一次阅读并执行一些长期的操作&然后在完成处理后,我将回复发送回客户端。我是一个Java新手,请引导我正确的方向,我也阅读了文档&一些教程,但我仍然想知道!

回答

1

这里是一个示例聊天应用程序netty3netty4

此外,对于聊天客户端,您似乎正在使用服务器端类:NioServerSocketChannelFactory。我认为你需要NioClientSocketChannelFactory

0

我怀疑问题是从缓冲区中读取会改变缓冲区的读取索引。当您将缓冲区写入通道时,读取索引位于数据的末尾。有几个选项

  • 使用readableBytes()来确定可读字节数,然后使用getByte(index)检索字节而不更改读索引。
  • 使用markReaderIndex和resetReaderIndex前,在循环读取的字节数
  • 使用buffer.duplicate得到共享的基础数据,但管理separeat读/写索引的缓冲区之后。

有关更多信息,请参阅ChannelBuffer(Netty 3)。