Netty學習4—NIO服務端報錯 遠端主機強迫關閉了一個現有的連線
阿新 • • 發佈:2018-11-15
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
1 發現問題
NIO程式設計中服務端會出現報錯
主要原因是客戶端強制關閉了連線(沒有呼叫SocketChannel的close方法),服務端還在read事件中,此時讀取客戶端的資訊時會報錯。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)
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(); } }