生活随笔
收集整理的這篇文章主要介紹了
Java NIO编写Socket服务器的一个例子
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近一直在忙著JAVA NIO的知識,花了一下午的時間,總算寫出了一個可以運行的程序,廢話少說,上代碼!
Java代碼:
import?java.io.IOException; ?import?java.net.InetSocketAddress; ?import?java.net.ServerSocket; ?import?java.nio.ByteBuffer; ?import?java.nio.channels.SelectionKey; ?import?java.nio.channels.Selector; ?import?java.nio.channels.ServerSocketChannel; ?import?java.nio.channels.SocketChannel; ?import?java.util.Iterator; ?import?java.util.Set; ??public?class?NIOServer?{ ????? ??????????private??int?flag?=?0; ??????????private??int?BLOCK?=?4096; ??????????private??ByteBuffer?sendbuffer?=?ByteBuffer.allocate(BLOCK); ??????????private??ByteBuffer?receivebuffer?=?ByteBuffer.allocate(BLOCK); ?????private??Selector?selector; ??????public?NIOServer(int?port)?throws?IOException?{ ??????????????????ServerSocketChannel?serverSocketChannel?=?ServerSocketChannel.open(); ??????????????????serverSocketChannel.configureBlocking(false); ??????????????????ServerSocket?serverSocket?=?serverSocketChannel.socket(); ??????????????????serverSocket.bind(new?InetSocketAddress(port)); ??????????????????selector?=?Selector.open(); ??????????????????serverSocketChannel.register(selector,?SelectionKey.OP_ACCEPT); ?????????System.out.println("Server?Start----8888:"); ?????} ????????????private?void?listen()?throws?IOException?{ ?????????while?(true)?{ ??????????????????????????selector.select(); ??????????????????????????Set<SelectionKey>?selectionKeys?=?selector.selectedKeys(); ?????????????Iterator<SelectionKey>?iterator?=?selectionKeys.iterator(); ?????????????while?(iterator.hasNext())?{???????? ?????????????????SelectionKey?selectionKey?=?iterator.next(); ?????????????????iterator.remove(); ?????????????????handleKey(selectionKey); ?????????????} ?????????} ?????} ???????????private?void?handleKey(SelectionKey?selectionKey)?throws?IOException?{ ??????????????????ServerSocketChannel?server?=?null; ?????????SocketChannel?client?=?null; ?????????String?receiveText; ?????????String?sendText; ?????????int?count=0; ??????????????????if?(selectionKey.isAcceptable())?{ ??????????????????????????server?=?(ServerSocketChannel)?selectionKey.channel(); ???????????????????????????????????????client?=?server.accept(); ??????????????????????????client.configureBlocking(false); ??????????????????????????client.register(selector,?SelectionKey.OP_READ); ?????????}?else?if?(selectionKey.isReadable())?{ ??????????????????????????client?=?(SocketChannel)?selectionKey.channel(); ??????????????????????????receivebuffer.clear(); ??????????????????????????count?=?client.read(receivebuffer);? ?????????????if?(count?>?0)?{ ?????????????????receiveText?=?new?String(?receivebuffer.array(),0,count); ?????????????????System.out.println("服務器端接受客戶端數據--:"+receiveText); ?????????????????client.register(selector,?SelectionKey.OP_WRITE); ?????????????} ?????????}?else?if?(selectionKey.isWritable())?{ ??????????????????????????sendbuffer.clear(); ??????????????????????????client?=?(SocketChannel)?selectionKey.channel(); ?????????????sendText="message?from?server--"?+?flag++; ??????????????????????????sendbuffer.put(sendText.getBytes()); ???????????????????????????sendbuffer.flip(); ??????????????????????????client.write(sendbuffer); ?????????????System.out.println("服務器端向客戶端發送數據--:"+sendText); ?????????????client.register(selector,?SelectionKey.OP_READ); ?????????} ?????} ??????????????public?static?void?main(String[]?args)?throws?IOException?{ ??????????????????int?port?=?8888; ?????????NIOServer?server?=?new?NIOServer(port); ?????????server.listen(); ?????} ?}?
Java代碼:
import?java.io.IOException; ?import?java.net.InetSocketAddress; ?import?java.nio.ByteBuffer; ?import?java.nio.channels.SelectionKey; ?import?java.nio.channels.Selector; ?import?java.nio.channels.SocketChannel; ?import?java.util.Iterator; ?import?java.util.Set; ??public?class?NIOClient?{ ???????????private?static?int?flag?=?0; ??????????private?static?int?BLOCK?=?4096; ??????????private?static?ByteBuffer?sendbuffer?=?ByteBuffer.allocate(BLOCK); ??????????private?static?ByteBuffer?receivebuffer?=?ByteBuffer.allocate(BLOCK); ??????????private?final?static?InetSocketAddress?SERVER_ADDRESS?=?new?InetSocketAddress( ?????????????"localhost",?1111); ??????public?static?void?main(String[]?args)?throws?IOException?{ ???????????????????????????SocketChannel?socketChannel?=?SocketChannel.open(); ??????????????????socketChannel.configureBlocking(false); ??????????????????Selector?selector?=?Selector.open(); ??????????????????socketChannel.register(selector,?SelectionKey.OP_CONNECT); ??????????????????socketChannel.connect(SERVER_ADDRESS); ?????????????????? ?????????Set<SelectionKey>?selectionKeys; ?????????Iterator<SelectionKey>?iterator; ?????????SelectionKey?selectionKey; ?????????SocketChannel?client; ?????????String?receiveText; ?????????String?sendText; ?????????int?count=0; ??????????while?(true)?{ ???????????????????????????????????????selector.select(); ??????????????????????????selectionKeys?=?selector.selectedKeys(); ??????????????????????????iterator?=?selectionKeys.iterator(); ?????????????while?(iterator.hasNext())?{ ?????????????????selectionKey?=?iterator.next(); ?????????????????if?(selectionKey.isConnectable())?{ ?????????????????????System.out.println("client?connect"); ?????????????????????client?=?(SocketChannel)?selectionKey.channel(); ???????????????????????????????????????????????????????????????if?(client.isConnectionPending())?{ ?????????????????????????client.finishConnect(); ?????????????????????????System.out.println("完成連接!"); ?????????????????????????sendbuffer.clear(); ?????????????????????????sendbuffer.put("Hello,Server".getBytes()); ?????????????????????????sendbuffer.flip(); ?????????????????????????client.write(sendbuffer); ?????????????????????} ?????????????????????client.register(selector,?SelectionKey.OP_READ); ?????????????????}?else?if?(selectionKey.isReadable())?{ ?????????????????????client?=?(SocketChannel)?selectionKey.channel(); ??????????????????????????????????????????receivebuffer.clear(); ??????????????????????????????????????????count=client.read(receivebuffer); ?????????????????????if(count>0){ ?????????????????????????receiveText?=?new?String(?receivebuffer.array(),0,count); ?????????????????????????System.out.println("客戶端接受服務器端數據--:"+receiveText); ?????????????????????????client.register(selector,?SelectionKey.OP_WRITE); ?????????????????????} ??????????????????}?else?if?(selectionKey.isWritable())?{ ?????????????????????sendbuffer.clear(); ?????????????????????client?=?(SocketChannel)?selectionKey.channel(); ?????????????????????sendText?=?"message?from?client--"?+?(flag++); ?????????????????????sendbuffer.put(sendText.getBytes()); ???????????????????????????????????????????sendbuffer.flip(); ?????????????????????client.write(sendbuffer); ?????????????????????System.out.println("客戶端向服務器端發送數據--:"+sendText); ?????????????????????client.register(selector,?SelectionKey.OP_READ); ?????????????????} ?????????????} ?????????????selectionKeys.clear(); ?????????} ?????} ?}?
個人感覺,JAVA NIO的操作時麻煩了不少,但是無疑這樣做效率會得到很大的提升。
總結
以上是生活随笔為你收集整理的Java NIO编写Socket服务器的一个例子的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。