1. 程式人生 > >Netty學習4—NIO服務端報錯 遠端主機強迫關閉了一個現有的連線

Netty學習4—NIO服務端報錯 遠端主機強迫關閉了一個現有的連線

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

1 發現問題

NIO程式設計中服務端會出現報錯

Exception in thread "main" java.io.IOException: 遠端主機強迫關閉了一個現有的連線。 at sun.nio.ch.SocketDispatcher.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:25) at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233) at sun.nio.ch.IOUtil.read(IOUtil.java:206) at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:207) at com.rb.socket.nio.server.n.NIOServer.handleKey(NIOServer.java:87) at com.rb.socket.nio.server.n.NIOServer.listen(NIOServer.java:57) at com.rb.socket.nio.server.n.NIOServer.main(NIOServer.java:122)
主要原因是客戶端強制關閉了連線(沒有呼叫SocketChannel的close方法),服務端還在read事件中,此時讀取客戶端的資訊時會報錯。

2 解決問題

伺服器讀取事件增強健壯性:

 public void handelerRead(SelectionKey key) throws IOException {  // 伺服器可讀取訊息:得到事件發生的Socket通道  SocketChannel channel = (SocketChannel) key.channel();  // 建立讀取的緩衝區
  ByteBuffer buffer = ByteBuffer.allocate(1024);  int read = channel.read(buffer);  if (read > 0) {   byte[] data = buffer.array();   String msg = new String(data).trim();   System.out.println("服務端收到資訊:" + msg);   // 回寫資料, 將訊息回送給客戶端
   ByteBuffer outBuffer = ByteBuffer.wrap("好的".getBytes());   channel.write(outBuffer);  } else {   System.out.println("客戶端關閉");   key.cancel();  } }


原貼地址:http://www.myexception.cn/program/1059786.html

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述