JAVA基礎知識之網絡編程——-基于AIO的異步Socket通信

異步IO

下面摘子李剛的《瘋狂JAVA講義》

按照POSIX標準來劃分IO,分為同步IO和異步IO。對于IO操作分為兩步,1)程序發出IO請求。 2)完成實際的IO操作。

阻塞IO和非阻塞IO都是針對第一步來劃分的,如果發出IO請求會阻塞線程,就是阻塞IO,否則就是非阻塞IO。

同步IO和非同步IO是針對第二步來說的,如果實際IO操作是由操作系統完成,再返回給程序,就是異步IO。

如果實際的IO需要程序本身去執行,會阻塞線程,就是同步IO。

?

JAVA7的NIO.2提供了異步的channel, 從而使網絡Socket的異步通信成為可能。

使用異步IO通信只需要三步,

  1. 調用open靜態方法創建AsynchronousServerSocketChannel
  2. 調用AsynchronousServerSocketChannel的bind方法監聽指定IP和端口
  3. 調用AsynchronousServerSocketChannel的accept方法接受連接請求

下面是一個簡單例子,

服務器端

 1 package aio;
 2 
 3 import java.io.IOException;
 4 import java.net.InetSocketAddress;
 5 import java.nio.ByteBuffer;
 6 import java.nio.channels.AsynchronousServerSocketChannel;
 7 import java.nio.channels.AsynchronousSocketChannel;
 8 import java.util.concurrent.ExecutionException;
 9 import java.util.concurrent.Future;
10 
11 public class Server {
12     private static final int PORT = 3002;
13     public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
14         try {
15             AsynchronousServerSocketChannel serverChannel =  AsynchronousServerSocketChannel.open();
16             serverChannel.bind(new InetSocketAddress(PORT));
17             while (true) {
18                 Future<AsynchronousSocketChannel> future = serverChannel.accept();
19                 //獲取連接成功之后的AsynchronousSocketChannel
20                 AsynchronousSocketChannel socketChannel = future.get();
21                 socketChannel.write(ByteBuffer.wrap("你好,這是AIO世界".getBytes("utf-8"))).get();
22             }
23         } catch(IOException e) {
24             e.printStackTrace();
25         }
26     }
27 }

客戶端

 1 package aio;
 2 
 3 import java.io.IOException;
 4 import java.net.InetSocketAddress;
 5 import java.nio.ByteBuffer;
 6 import java.nio.channels.AsynchronousSocketChannel;
 7 import java.nio.charset.Charset;
 8 import java.util.concurrent.ExecutionException;
 9 
10 public class Client {
11     private static final int PORT = 3002;
12     public static void main(String[] args) throws IOException, InterruptedException, ExecutionException {
13         ByteBuffer buff = ByteBuffer.allocate(1024);
14         Charset utf = Charset.forName("utf-8");
15         try {
16             AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
17             clientChannel.connect(new InetSocketAddress("127.0.0.1",PORT)).get();
18             buff.clear();
19             clientChannel.read(buff).get();
20             buff.flip();
21             String content = utf.decode(buff).toString();
22             System.out.println("服務器信息:"+content);
23         } catch (IOException ex) {
24             ex.printStackTrace();
25         }
26     }
27 }

執行結果,使用一個服務器端和兩個客戶端測試,

?

轉載于:https://www.cnblogs.com/fysola/p/6087227.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285438.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于.NetCore開發博客項目 StarBlog - (13) 加入友情鏈接功能

系列文章基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客&#xff1f;基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目基于.NetCore開發博客項目 StarBlog - (3) 模型設計基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入基于.N…

【數據庫原理及應用】經典題庫附答案(14章全)——第十二章:數據庫技術新發展

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

EditPlus 文件查找功能:在指定文件夾,用正則查尋包含指定內容的文件,指定文件類型,并排除特殊文件名文件

單擊菜單欄上的【Search】&#xff08;查找&#xff09;&#xff0c;選擇【Find in Files】&#xff08;在文件中查找&#xff09;命令&#xff1a; 查找項&#xff1a;正則查找video標簽&#xff0c;src為不包含http的mp4 <video src"([^http].*\.mp4)" width&q…

【數據庫原理及應用】經典題庫附答案(14章全)——第十三章:面向對象程數據庫系統

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

NOIP2016普及組第三題——海港

題目描述 小K是一個海港的海關工作人員&#xff0c;每天都有許多船只到達海港&#xff0c;船上通常有很多來自不同國家的乘客。 小K對這些到達海港的船只非常感興趣&#xff0c;他按照時間記錄下了到達海港的每一艘船只情況&#xff1b;對于第i艘到達的船&#xff0c;他記錄了這…

7z-linux下解決中文名亂碼的終極辦法

為什么80%的碼農都做不了架構師&#xff1f;>>> linux上安裝7z主要是為了解決中文文件名亂碼的問題&#xff0c;壓縮率還是其次原因 具體安裝看參考網址&#xff0c;建議用源碼方式安裝 官網下載地址&#xff1a;http://www.7-zip.org/download.html 源文件項目地址…

C# .Net 視頻下載功能(本機文件)及轉發下載功能(Http遠程文件)

/*服務器本機文件下載*/ Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.AddHeader("Content-Transfer-Encoding", "binary"); Response.ContentType "application/octet-stream"; Response.ContentEncoding …

工具箱之 IKVM.NET 項目新進展

在各種群里經常討論的一個事情是.NET 如何調用 Java 的實現&#xff0c;最常見的場景之一就是在加解密方面Java提供的密鑰&#xff0c;C#無法解密&#xff0c; C#中byte范圍是[0,255]&#xff0c;而Java中的byte范圍是[-128,127]&#xff0c;由于密碼生成器是java所獨有的&…

【數據庫原理及應用】經典題庫附答案(14章全)——第十四章:分布式數據庫系統

【數據庫原理及應用】經典題庫附答案(14章全)——第一章:數據庫基礎知識 【數據庫原理及應用】經典題庫附答案(14章全)——第二章:關系數據庫知識 【數據庫原理及應用】經典題庫附答案(14章全)——第三章:結構化查詢語言SQL 【數據庫原理及應用】經典題庫附答案(14章…

一天一種設計模式之六-----工廠方法模式

2019獨角獸企業重金招聘Python工程師標準>>> 一.工廠方法模式 工廠方法模式屬于創建型模式。工廠方法模式定義&#xff1a;定義一個用于創建對象的借口&#xff0c;讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到了他的子類。一般工廠類會有一個工廠的接…

[轉]IPython介紹

1. IPython介紹 ipython是一個python的交互式shell&#xff0c;比默認的python shell好用得多&#xff0c;支持變量自動補全&#xff0c;自動縮進&#xff0c;支持bash shell命令&#xff0c;內置了許多很有用的功能和函數。學習ipython將會讓我們以一種更高的效率來使用python…

.NET MAUI in Mac

點擊上方藍字關注我們&#xff08;本文閱讀時間&#xff1a;4分鐘&#xff09;概要本篇文章主要分享MAUI在m1芯片的設備上運行和支持情況&#xff0c;將我們寫好的MAUI程序編譯為支持mac平臺的版本。在m1芯片剛剛出來的時候有很多開發工具和應用程序對m1芯片的支持不是很友好&a…

30分鐘時長千行代碼《C#程序設計基礎》經典程序,C#菜鳥開發必備!

作者:劉一哥GIS(CSDN博客專家) 博客地址:https://geostorm.blog.csdn.net/ 劉一哥,多年研究地圖學、地理信息系統、遙感、攝影測量和GPS等應用,精通ArcGIS、MapGIS、ENVI、Erdas、CASS、Pix4d、CC、PhotoScan、Inpho、EPS、Globalmapper等專業軟件的應用,精通多門編程語…

前端開發中的SEO

前端開發中的SEO 什么是SEO SEO由英文Search Engine Optimization縮寫而來&#xff0c;中文意譯為“搜索引擎優化”。SEO是指從自然搜索結果獲得網站流量的技術和過程&#xff0c;是在了解搜索引擎自然排名機制的基礎上&#xff0c;對網站進行內部及外部的調整優化&#xff0c;…

grep命令

請見附件&#xff1b;轉載于:https://blog.51cto.com/11203760/1750457

windows 常用系統變量

常用&#xff1a; %USERPROFILE% C:\Users\用戶名 %SystemRoot% C:\WINDOWS %SystemDrive% C: %APPDATA% C:\Users\用戶名\AppData\Roaming %LOCALAPPDATA% C:\Users\用戶名\AppData\Local %windir% C:\WINDOWS %Path% C:\Windows\system32;C:\Wi…

C# 自定義并動態切換光標

本文經原作者授權以原創方式二次分享&#xff0c;歡迎轉載、分享。原文作者&#xff1a;唐宋元明清的博客原文地址&#xff1a;https://www.cnblogs.com/kybs0/p/14873136.html系統有很多光標類型 &#xff1a;Cursors 類 (System.Windows.Input) | Microsoft Docs[1]本章介紹如…

HTML基礎加強

1. 什么是瀏覽器&#xff1a;解釋和執行HTML源碼的工具。 2. 什么是靜態頁面&#xff0c;什么樣的頁面是動態頁面&#xff1f; 靜態頁面&#xff1a;htm&#xff0c;html&#xff08;直接讀取&#xff09; 動態網頁&#xff1a;asp&#xff0c;aspx&#xff0c;jsp&#xff0c;…

視頻播放器for android

寫在前面 好久沒有寫博客了, 中間忙了一堆雜七雜八的事情...工作, 情感, 未來, 人生... 下面是正文 一直要寫一個視頻播放器, 好練練手. 這個app, 從年前寫到現在, 終于算弄出了樣子, 0.0版本. (不得不說, googleVPN值得擁有, android developer網站, android sdk samples, sta…

我要偷偷學習C#,然后學習GIS二次開發之試題匯總(附答案)

一、單項選擇題(每小題2分,共20分) 在類作用域中能夠通過直接使用該類的( )成員名進行訪問。 A. 私有 B. 公用 C. 保護 D. 任何 答案:D 小數類型(decimal)和浮點類型都可以表示小數,正確說法:( ) A. 兩者沒有任何區別 B. 小數類型比浮點類型取值范圍大 C.小數類型比浮…