2013-04-27 129 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)。