精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

用Java.nio.* 進行網絡編程

開發 后端
因為打算用java編寫異步通信的server和client程序,筆者便學習使用java.nio開發包,其間遇到一些問題,上網卻發現網上對它的應用描述的不是很多。所以,筆者不惜班門弄斧,做些簡單的討論,以便大家更進一步的討論。

前言

因為打算用java編寫異步通信的server和client程序,筆者便學習使用java.nio開發包,其間遇到一些問題,上網卻發現網上對它的應用描述的不是很多。所以,筆者不惜班門弄斧,做些簡單的討論,以便大家更進一步的討論。

對相關類的簡單介紹

java.nio.*, 據說它提供了一些更加底層的一些功能,如:類似windows環境下的AsyncSocket類的異步操作的功能,能顯著降低server端程序的線程管理開銷。

因為大多數應用是建立在TCP之上,所以在此只說說SocketChannel,ServerSocketChannel,Selector 和ByteBuffer這幾個類.前三個最終都源自channel類。而channel 類,可以理解為在具體I/O或文件對象之上抽象的一個操作對象,我們通過操作channel的讀寫達到對其對應的文件或I/O對象(包括socket)讀寫的目的。讀寫的內容在內存中放在ByteBuffer類提供的緩沖區。總而言之,channel作為一個橋梁,連接了I/O對象和內存中的 ByteBuffer,實現了I/O的更高效的存取。

一個基于TCP的服務器端程序,必然有個偵聽端和若干個通信端,它們在nio中由對應的ServerSocketChannel 和SocketChannel類來實現。為了達到異步I/O操作的目的,需要Selector類,它能檢測到I/O對象的狀態。

SocketChannel類是抽象類,通過調用它的靜態函數open(),可生成一個SocketChannel對象,該對象對應一個java.net.Socket,可通過SocketChannel.socket()獲得,而其對應的Socket也可通過調用函數getChannel()得到已建立的相應SocketChannel。

SocketChannel與它的socket是一一對應的。SocketChannel的操作與Socket也很相似。

ServerSocketChannel也是通過調用它的靜態函數open()生成的,只是它不能直接調用bind()函數來綁定一個地址,需要它對應的ServerSocket來完成綁定工作,一般可按如下步驟做:

  1. ServerSocketChannel ssc = new ServerSocketChannel.open(); 
  2. ssc.socket().bind(InetSocketAddress(host,port)); 

羅嗦了半天,還是看看最簡單的C/S實現吧,服務器提供了基本的回射(echo)功能,其中提供了較詳細的注釋。

源碼分析

1.服務器端:

  1. //////////////////////// 
  2. //AsyncServer.java 
  3. // by zztudou@163.com 
  4. //////////////////////// 
  5. import java.nio.channels.SocketChannel; 
  6. import java.nio.channels.ServerSocketChannel; 
  7. import java.nio.channels.SelectionKey; 
  8. import java.nio.channels.Selector; 
  9. import java.nio.ByteBuffer; 
  10. import java.nio.channels.SelectableChannel; 
  11. import java.nio.channels.spi.SelectorProvider; 
  12. import java.net.ServerSocket; 
  13. import java.net.Socket; 
  14. import java.net.InetSocketAddress; 
  15. import java.net.SocketAddress; 
  16. import java.util.Iterator; 
  17. import java.util.LinkedList; 
  18. import java.io.IOException; 
  19.  
  20. class AsyncServer implements Runnable{  
  21. private ByteBuffer r_buff = ByteBuffer.allocate(1024); 
  22. private ByteBuffer w_buff = ByteBuffer.allocate(1024); 
  23. private static int port = 8848
  24.  
  25. public AsyncServer(){ 
  26. new Thread(this).start(); 
  27.  
  28. public void run(){  
  29. try
  30. //生成一個偵聽端 
  31. ServerSocketChannel ssc = ServerSocketChannel.open(); 
  32. //將偵聽端設為異步方式 
  33. ssc.configureBlocking(false); 
  34. //生成一個信號監視器 
  35. Selector s = Selector.open(); 
  36. //偵聽端綁定到一個端口 
  37. ssc.socket().bind(new InetSocketAddress(port)); 
  38. //設置偵聽端所選的異步信號OP_ACCEPT 
  39. ssc.register(s,SelectionKey.OP_ACCEPT); 
  40.  
  41. System.out.println("echo server has been set up ......"); 
  42.  
  43. while(true){ 
  44. int n = s.select(); 
  45. if (n == 0) {//沒有指定的I/O事件發生 
  46. continue
  47. }  
  48. Iterator it = s.selectedKeys().iterator();  
  49. while (it.hasNext()) { 
  50. SelectionKey key = (SelectionKey) it.next(); 
  51. if (key.isAcceptable()) {//偵聽端信號觸發 
  52. ServerSocketChannel server = (ServerSocketChannel) key.channel(); 
  53. //接受一個新的連接 
  54. SocketChannel sc = server.accept(); 
  55. sc.configureBlocking(false); 
  56. //設置該socket的異步信號OP_READ:當socket可讀時, 
  57.  
  58. //觸發函數DealwithData(); 
  59. sc.register(s,SelectionKey.OP_READ); 
  60. }  
  61. if (key.isReadable()) {//某socket可讀信號 
  62. DealwithData(key); 
  63. }  
  64. it.remove(); 
  65. catch(Exception e){ 
  66. e.printStackTrace();  
  67.  
  68. public void DealwithData(SelectionKey key) throws IOException{ 
  69. int count; 
  70. //由key獲取指定socketchannel的引用 
  71. SocketChannel sc = (SocketChannel)key.channel(); 
  72. r_buff.clear(); 
  73. //讀取數據到r_buff 
  74. while((count = sc.read(r_buff))> 0
  75. //確保r_buff可讀 
  76. r_buff.flip(); 
  77.  
  78. w_buff.clear(); 
  79. //將r_buff內容拷入w_buff  
  80. w_buff.put(r_buff); 
  81. w_buff.flip(); 
  82. //將數據返回給客戶端 
  83. EchoToClient(sc); 
  84.  
  85. w_buff.clear(); 
  86. r_buff.clear(); 
  87.  
  88. public void EchoToClient(SocketChannel sc) throws IOException{ 
  89. while(w_buff.hasRemaining()) 
  90. sc.write(w_buff); 
  91.  
  92. public static void main(String args[]){ 
  93. if(args.length > 0){ 
  94. port = Integer.parseInt(args[0]); 
  95. new AsyncServer(); 

在當前目錄下運行:

javac AsynServer.java

后,若無編譯出錯,接下來可運行:

java AsynServer 或 java AsynServer ×××(端口號)

上述服務程序在運行時,可指定其偵聽端口,否則程序會取8848為默認端口。

2.客戶端的簡單示例:

  1. //////////////////////// 
  2. //AsyncClient.java 
  3. // by zztudou@163.com 
  4. //////////////////////// 
  5. import java.nio.channels.SocketChannel; 
  6. import java.net.InetSocketAddress; 
  7. import java.nio.ByteBuffer; 
  8. import java.nio.channels.Selector; 
  9. import java.nio.channels.SelectionKey; 
  10.  
  11. import java.io.IOException; 
  12. import java.io.BufferedReader; 
  13. import java.io.InputStreamReader; 
  14.  
  15. class AsyncClient{ 
  16. private SocketChannel sc; 
  17. private final int MAX_LENGTH = 1024
  18. private ByteBuffer r_buff = ByteBuffer.allocate(MAX_LENGTH); 
  19. private ByteBuffer w_buff = ByteBuffer.allocate(MAX_LENGTH); 
  20. private static String host ; 
  21. private static int port = 8848
  22.  
  23. public AsyncClient(){ 
  24. try { 
  25. InetSocketAddress addr = new InetSocketAddress(host,port); 
  26. //生成一個socketchannel 
  27. sc = SocketChannel.open(); 
  28.  
  29. //連接到server 
  30. sc.connect(addr); 
  31. while(!sc.finishConnect()) 
  32. ;  
  33. System.out.println("connection has been established!..."); 
  34.  
  35. while(true){ 
  36. //回射消息 
  37. String echo; 
  38. try
  39. System.err.println("Enter msg you'd like to send: "); 
  40. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
  41. //輸入回射消息 
  42. echo = br.readLine(); 
  43.  
  44. //把回射消息放入w_buff中  
  45. w_buff.clear(); 
  46. w_buff.put(echo.getBytes()); 
  47. w_buff.flip(); 
  48. }catch(IOException ioe){ 
  49. System.err.println("sth. is wrong with br.readline() "); 
  50. }  
  51.  
  52. //發送消息 
  53. while(w_buff.hasRemaining()) 
  54. sc.write(w_buff); 
  55. w_buff.clear();  
  56.  
  57. //進入接收狀態 
  58. Rec(); 
  59. //間隔1秒 
  60. Thread.currentThread().sleep(1000); 
  61. }  
  62. }catch(IOException ioe){ 
  63. ioe.printStackTrace(); 
  64. catch(InterruptedException ie){ 
  65. ie.printStackTrace(); 
  66. }  
  67. //////////// 
  68. //讀取server端發回的數據,并顯示 
  69. public void Rec() throws IOException{ 
  70. int count; 
  71. r_buff.clear();  
  72. count=sc.read(r_buff); 
  73. r_buff.flip();  
  74. byte[] temp = new byte[r_buff.limit()]; 
  75. r_buff.get(temp); 
  76. System.out.println("reply is " + count +" long, and content is: " + new String(temp)); 
  77.  
  78. public static void main(String args[]){ 
  79. if(args.length < 1){//輸入需有主機名或IP地址 
  80. try
  81. System.err.println("Enter host name: "); 
  82. BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
  83. host = br.readLine(); 
  84. }catch(IOException ioe){ 
  85. System.err.println("sth. is wrong with br.readline() "); 
  86. else if(args.length == 1){ 
  87. host = args[0]; 
  88. else if(args.length > 1){ 
  89. host = args[0]; 
  90. port = Integer.parseInt(args[1]); 
  91.  
  92. new AsyncClient(); 

在當前目錄下運行:

javac AsynClient.java

后,若無編譯出錯,確認AsyncServer已經運行的情況下,接下來可運行:

java AsynClient hostname 或 java AsynClient hostname ×××(端口號)

并按提示進行操作即可。

總 結

總的來說,用nio進行網絡編程還是很有新意的,服務器端軟件能在一個線程中維護與眾多客戶端的通信連接。筆者在本文中試圖用一個典型的回射例子說明如何用nio建立最基本的C/S應用。希望大家能試著用用它。
另外,筆者在實踐中也發現nio在應用中存在的一些難題,比如如何應用SocketChannel的繼承類,以及如何在socketchannel之上應用SSL(Secure Socket Layer)等等,因而希望這篇文章只是拋磚引玉,引起大家對nio作進一步的討論。

原文鏈接:http://lrtlcg.iteye.com/blog/844357

【編輯推薦】

  1. Java NIO的wakeup剖析
  2. Java NIO類庫關系圖解
  3. 淺析Tomcat NIO 配置
  4. Java NIO API詳解
  5. Java NIO基本使用實例
責任編輯:林師授 來源: lrtlcg的博客
相關推薦

2011-12-08 10:24:53

JavaNIO

2011-12-15 09:40:06

Javanio

2010-10-27 10:19:33

UnicodeJava

2011-12-13 17:31:07

2021-06-11 17:26:06

代碼Java網絡編程

2024-05-17 09:49:44

RustCursive界面

2011-06-13 12:11:06

javasocket

2011-06-13 11:23:33

javasocket

2023-07-28 08:23:05

選擇器Java NIO

2011-12-15 10:56:55

JavaNIO

2022-02-14 15:07:48

進程FileChanne線程

2012-10-23 09:47:01

MapReduceJavaHadoop

2011-06-17 17:27:29

Objective-CCocoa蘋果

2019-09-05 14:21:22

JavaNIOBIO

2022-12-08 09:10:11

I/O模型Java

2010-12-24 10:25:20

SCP 命令

2011-04-06 11:36:28

MRTG流量

2011-12-15 09:55:47

javanio

2011-12-07 14:57:44

JavaNIO

2011-12-15 11:19:08

JavaNIO
點贊
收藏

51CTO技術棧公眾號

久久久久亚洲AV成人网人人小说| 99re视频在线| 少妇精品无码一区二区免费视频| 超碰激情在线| 久久欧美中文字幕| 国产美女精品视频免费观看| 欧美丰满艳妇bbwbbw| 美女一区2区| 精品视频免费看| www.avtt| 北条麻妃在线| 成人一区在线看| 国产精品88a∨| 国产精品 欧美激情| 成人51免费| 精品美女国产在线| 国产又粗又爽又黄的视频| 天天爱天天干天天操| 日本sm残虐另类| 一本一本久久a久久精品综合小说| 欧美牲交a欧美牲交aⅴ免费下载| 日本天堂影院在线视频| 国产一区激情在线| 国产成人精品在线视频| 精品在线视频免费| 国产精品久久久久无码av| 日韩电影中文字幕| 国产无套精品一区二区三区| 黄色成人在线网| 99视频超级精品| 91亚洲精品视频| 一级黄色av片| 91九色精品国产一区二区| 精品亚洲国产成av人片传媒| 麻豆精品国产传媒| 香蕉久久久久久| 在线观看免费成人| 毛片在线视频播放| 国产黄色免费在线观看| 精品一二三四区| 欧美性一区二区三区| 黄色录像二级片| 精品视频99| 亚洲美女久久久| 欧美在线一级片| 韩国精品主播一区二区在线观看| 国产精品美女www爽爽爽| 亚洲综合自拍一区| 久久国产精品系列| 亚洲国产片色| 国模叶桐国产精品一区| 久久久无码一区二区三区| 911久久香蕉国产线看观看| 在线视频一区二区| 欧美福利在线视频| 日韩成人a**站| 正在播放欧美一区| 蜜桃av免费在线观看| 成人3d动漫在线观看| 亚洲欧美日韩爽爽影院| 亚洲永久精品ww.7491进入| 美女视频免费精品| 日韩成人性视频| 91pony九色| 亚洲日本免费电影| 337p亚洲精品色噜噜| 亚洲av无日韩毛片久久| 国语精品视频| 欧美成人一级视频| 国产精品成人99一区无码 | 99久久综合国产精品二区| 亚洲综合视频网| 水蜜桃色314在线观看| 涩涩涩在线视频| 亚洲另类在线制服丝袜| 青青在线视频免费观看| 日本免费视频在线观看| 亚洲欧美偷拍三级| 国产深夜男女无套内射| 日本欧美电影在线观看| 亚洲午夜激情网页| 少妇性饥渴无码a区免费| 精品成人av| 91麻豆精品国产自产在线| 国产乱淫av麻豆国产免费| 日韩精品欧美大片| 中文字幕亚洲在线| 激情五月婷婷在线| 久久永久免费| 亚洲自拍av在线| 亚洲av毛片成人精品| 中文字幕免费不卡在线| 精品免费久久久久久久| 天天免费亚洲黑人免费| 91麻豆精品国产91久久久 | 蜜桃久久av| 国产精品中文字幕在线观看| 在线观看亚洲一区二区| 国产成人精品一区二区三区四区| 91在线观看免费高清| 天堂网在线资源| 中文字幕va一区二区三区| 日本福利视频网站| 人人鲁人人莫人人爱精品| 黑人巨大精品欧美一区二区免费| 国产一区二区三区小说| 日韩成人高清| 亚洲成人av在线| 人妻无码一区二区三区免费| 亚洲日本免费| 成人免费网站在线看| 欧美一区二区少妇| 亚洲综合一二区| 无码粉嫩虎白一线天在线观看 | 蜜乳av综合| 欧美巨大黑人极品精男| 中文字幕免费高清在线观看| 成人激情av网| avove在线观看| 主播大秀视频在线观看一区二区| 欧美性猛片aaaaaaa做受| 亚洲欧美日韩色| 91久久国产| 国产精品av在线播放| 黄色片一区二区三区| 亚洲欧美中日韩| www插插插无码免费视频网站| 国产美女福利在线观看| 欧美日韩国产一级片| 成年人网站av| 久久社区一区| 国产精品高清网站| av网站免费大全| 中文字幕在线视频一区| 国产成人一区二区三区别| 345成人影院| 精品国产伦一区二区三区免费| 黄色工厂在线观看| 伊人久久大香线蕉综合热线| 亚洲综合精品伊人久久| 黄色网在线播放| 欧美嫩在线观看| 国产三级aaa| 日本欧美在线观看| 日本不卡在线观看| 欧美7777| 亚洲午夜精品视频| 精人妻无码一区二区三区| 91麻豆精品秘密| 99久久激情视频| 国产精品嫩模av在线| 欧美激情videoshd| 超碰福利在线观看| 亚洲一区二区三区中文字幕 | 瑟瑟视频在线| 欧美精品国产精品| 永久久久久久久| 日韩av一区二区在线影视| 99porn视频在线| 黄色小说在线播放| 3751色影院一区二区三区| 精品无码久久久久成人漫画| 黄一区二区三区| 日本中文不卡| 精品国产黄a∨片高清在线| 亚洲国产精品久久久久秋霞不卡| 最新黄色av网址| 激情综合色综合久久综合| 人禽交欧美网站免费| 丁香婷婷久久| 精品中文字幕乱| 人妻精品一区二区三区| 欧美性猛交xxxx富婆弯腰| 欧美另类z0zx974| 国产精品日本欧美一区二区三区| 91免费福利视频| 成人影音在线| 亚洲男人7777| 夜夜躁狠狠躁日日躁av| 亚洲精品日日夜夜| 做a视频在线观看| 精品91久久久久| 久草热久草热线频97精品| av成人免费看| 欧美乱妇40p| 欧美亚洲日本| 日韩午夜激情视频| 久久久久久久久久久久久av| 国产宾馆实践打屁股91| 日韩avxxx| 中文字幕午夜精品一区二区三区| 91中文在线视频| jizzjizz中国精品麻豆| 欲色天天网综合久久| 精品国产无码AV| 色综合久久天天| 日韩在线中文字幕视频 | 男女视频在线看| 亚洲综合色网| 欧美日韩精品免费观看视一区二区| 美女的胸无遮挡在线观看| 中文国产亚洲喷潮| 在线观看免费视频a| 亚洲成人自拍网| 国产又粗又长又硬| 91丝袜美腿高跟国产极品老师| 1024精品视频| 欧美搞黄网站| 日韩精品另类天天更新| 丁香婷婷成人| 欧亚精品在线观看| 国产激情在线| 夜夜嗨av一区二区三区免费区| 亚洲一级片免费看| 日韩欧美在线一区| 人成免费在线视频| 精品一区二区三区在线观看 | 亚洲在线观看免费视频| 久久精品—区二区三区舞蹈| 成人短视频下载| 伊人免费视频二| 麻豆91在线看| 超碰影院在线观看| 国产精品女主播一区二区三区| 日本一区二区三区在线视频| 国产成人高清精品免费5388| 91天堂在线观看| 日本午夜免费一区二区| 国产精品狠色婷| 欧美一区 二区 三区| 69久久夜色精品国产7777| 久久av色综合| 欧美老女人性视频| 在线观看三级视频| 另类少妇人与禽zozz0性伦| 日韩子在线观看| 国产一区二区三区四区福利| 99在线观看免费| 欧美精品黑人性xxxx| 一级黄色片在线观看| 日本福利一区二区| 久久久久久av无码免费网站| 亚洲欧洲99久久| 欧美精品久久久久久久久46p| av成人免费在线| 中国特级黄色大片| 成人性生交大片免费看视频在线| 精品久久久久久久无码| 米奇777在线欧美播放| 国产极品美女高潮无套久久久| 亚洲激情久久| 日本免费在线视频观看| 婷婷亚洲综合| 蜜桃网站在线观看| 午夜日韩福利| 日本人体一区二区| 亚洲精品123区| 欧美成人三级在线视频| 国产一区二区三区久久| 免费高清在线观看免费| 天堂av在线一区| 欧美成年人视频在线观看| 久久电影网站中文字幕| 99久久久无码国产精品6| 欧美区亚洲区| 妺妺窝人体色777777| 亚洲综合色网| 亚洲中文字幕无码av永久| 亚洲综合精品四区| 国产一二三四在线视频| 久久精品国产色蜜蜜麻豆| 日本女人黄色片| 成人不卡免费av| 谁有免费的黄色网址| av在线不卡免费看| 久久国产柳州莫菁门| 91免费在线视频观看| 97人妻人人揉人人躁人人| 国产精品久久久久久妇女6080 | 处破女av一区二区| 最新中文字幕视频| 亚洲欧洲精品一区二区三区 | 欧美人成在线观看| 国产一区成人| 涩涩网站在线看| 91视频.com| 亚洲区一区二区三| 中文字幕av在线一区二区三区| 亚洲黄色小说视频| 亚洲精品综合在线| 成年人午夜剧场| 色综合久久中文字幕| 4438国产精品一区二区| 91精品久久久久久蜜臀| 亚洲色偷精品一区二区三区| 北条麻妃一区二区三区中文字幕| 1769在线观看| 午夜精品福利电影| 欧美久久久网站| 久久久久久草| 亚洲天堂免费| 黄色一级一级片| 国产98色在线|日韩| 中文字幕第24页| 国产精品九色蝌蚪自拍| 我要看黄色一级片| 一本大道久久a久久综合| 中文字幕日本视频| 精品福利一区二区三区免费视频| 午夜视频www| 超薄丝袜一区二区| 欧美精品资源| 精品国产一区二区三区麻豆免费观看完整版 | 久久久91精品| 中文在线中文资源| 国产精品高清一区二区三区| 日韩欧美电影| 日本黄网站免费| www.久久久久久久久| 久久久精品视频免费观看| 欧美曰成人黄网| 黄色在线小视频| 97色在线视频| 高清欧美性猛交xxxx黑人猛| 91手机视频在线| 久久精品国产99国产| 精品人伦一区二区| 色综合色综合色综合色综合色综合| 这里只有精品免费视频| 日韩av综合网站| 丰满大乳少妇在线观看网站| 91免费国产网站| 999国产精品视频| 青青青青草视频| 国产成人av影院| 九九热精彩视频| 欧美一二三区精品| 黄色网页在线免费看| 91久久精品国产| 91九色精品国产一区二区| 污污网站在线观看视频| 亚洲国产成人午夜在线一区| 欧美日韩a v| 一区二区av在线| 韩国成人在线| 国产欧美韩日| 亚洲天堂偷拍| 理论片大全免费理伦片| 亚洲大型综合色站| 一二三四区在线| 亚洲精品网址在线观看| 成人黄视频在线观看| 91精品久久久久久蜜桃| 欧美日韩精品一本二本三本| 年下总裁被打光屁股sp| 亚洲成人免费观看| 99久久精品免费看国产交换| 久久精品视频中文字幕| 精品99re| 青草网在线观看| 成人av在线资源| 成人公开免费视频| 自拍偷拍亚洲区| 激情久久免费视频| 成人免费视频91| 国产精品资源在线观看| 国产一国产二国产三| 精品小视频在线| 国产一区精品福利| 国产精品视频二| 26uuu亚洲综合色欧美| 欧美亚洲另类小说| 亚洲人成77777在线观看网| 色豆豆成人网| 黄色a级在线观看| av一本久道久久综合久久鬼色| 国产乱国产乱老熟300| 欧美日韩国产另类不卡| av网站在线免费| 久久国产精品精品国产色婷婷| 国内精品亚洲| 欧美熟妇一区二区| 欧美日韩mp4| 男人的天堂在线视频免费观看 | 亚洲精品.com| 正在播放一区| zzijzzij亚洲日本少妇熟睡| 欧美黄片一区二区三区| 精品亚洲国产成av人片传媒| 亚洲一区二区小说| 97国产精东麻豆人妻电影| 国产精品欧美精品| 色一情一乱一区二区三区| 国产精品日韩av| 亚洲黄色影片| 日本一级特级毛片视频| 亚洲美女av黄| 99re8这里有精品热视频8在线| 99久久99久久精品| 国产亚洲精品aa|