Java基礎(Socket通訊和NIO)
1.Socket通訊
1.1 原理
連線:Server端要建立ServerSocket,用來監聽某一個埠如999,當客戶端建立socket物件時,就跟Server建立
了連線
通訊:伺服器端或客戶端都可通過Socket物件獲取輸入流和輸出流,通過輸入流和輸出流進行通訊
1.2 實現
Server端
public static void main(String[] args) throws Exception {
//1.建立ServerSocket物件,埠號範圍在0~65535,用來監聽某一個埠
ServerSocket ss = new ServerSocket(999);
System.out.println("伺服器已啟動...");
while(true){
//建立一個用於傳遞資料的套接字Socket
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new
InputStreamReader(s.getInputStream()));
System.out.println("等待客戶端資訊...");
Thread.sleep(500);
String str = br.readLine();
System.out.println("來自客戶端:"+s.getInetAddress()+"的內容:"+str);
//向客戶端傳送資訊
PrintWriter pw = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(s.getOutputStream())));
pw.println("使用者器已經收到你發來的資訊:"+str);
pw.flush();
s.close();
br.close();
pw.close();
}
}
Clien端
public static void main(String[] args) throws Exception {
//產生一個連線服務請求,併產生Socket物件
Socket s = new Socket("192.168.1.118",999);
//向伺服器傳送訊息
PrintWriter pw = new PrintWriter(new BufferedWriter(new
OutputStreamWriter(s.getOutputStream())));
System.out.println("開始向伺服器傳送資訊...");
pw.println("socket通訊中...");
pw.flush();
Thread.sleep(1000);
System.out.println("等待接收伺服器的訊息...");
BufferedReader br = new BufferedReader(new
InputStreamReader(s.getInputStream()));
System.out.println("來自伺服器:"+s.getInetAddress()+"的資訊:"+br.readLine());
s.close();
br.close();
pw.close();
}
- NIO
一、概述
NIO—Non Blocking IO,非阻塞IO
1.IO與NIO區別
IO:面向單向流的
NIO:面向緩衝區,寫資料時,把資料寫入緩衝區中,然後再把緩衝區中資料通過管道傳遞到接收端。非阻塞和
選擇器則是針對網路通訊使用
2.NIO的兩個技術
緩衝區:用於裝載資料,也就是陣列,有7種型別的資料
ByteBuffer
CharBuffer
ShortBuffer
IntBuffer
LongBuffer
FloatBuffer
DoubleBuffer
通道,channel:就是開啟到IO裝置的一個連線,通道用來傳輸資料
二、緩衝區與通道應用
1.直接緩衝區與非直接緩衝區的區別
直接緩衝區在資料讀寫時,會繞過JVM堆記憶體,速度快,因為少了一箇中間的copy過程,效率高
直接緩衝區的缺點:建立和銷燬比堆上緩衝區消耗大,不歸jvm管理,不安全
2.緩衝區使用
put(陣列):向緩衝區中存放資料
limit:界限,表示緩衝區可操作的資料大小
position:位置,表示緩衝區中正在運算元據的位置
get():從緩衝區當前位置讀一個資料
flip():對當前位置設定0,然後設定limit的值
mark():記錄當前位置
reset():恢復到mark位置
hasRemaining():判斷是否還有資料
remaining():獲取還有多少個資料
rewind();把position重置為0
clear():清空緩衝區,位置和界限恢復為初始狀態
array():把緩衝區中資料轉為陣列
3.通道channel
3.1 作用:
用於源節點與目標節點的連線,只用來跟buffer互動
3.2 型別
FileChannel:用來操作本地檔案
SocketChannel和ServerSocketChennel:用於 TCP資料傳輸
DatagramChannel:用於udp資料傳輸
4.分散與聚集
分散:指從Channel中讀取的資料依次分散到多個Buffer中
聚集:將多個Buffer中的資料按照順序寫入到一個channel中
三、非阻塞式應用
1.概念
什麼是阻塞?
程式在獲取網路資料時,如果網路傳輸慢,就會一直等待,直到傳輸完成才不等待,這種等待叫阻塞
什麼是非阻塞?
程式可直接獲取已經準備就緒的資料,無需等待
什麼是NIO?
伺服器的工作模式為一個請一個執行緒,也就是客戶端傳送的連線請求都會註冊到選擇器(多路複用器)上,多路複用
器輪詢到連線有IO請求時才啟動一個執行緒進行處理。
選擇器:用於監控通道中io狀況
相關文章
- Thinking in Java--使用NIO實現非阻塞Socket通訊ThinkingJava
- Java Socket 之 NIOJava
- Java網路程式設計和NIO詳解1:JAVA 中原生的 socket 通訊機制Java程式設計
- Java 和 Python 之間的 Socket 通訊JavaPython
- JAVA - 基於Socket的多執行緒通訊Java執行緒
- NIO基礎
- socket通訊
- Java的Socket通訊簡單例項Java單例
- NIO(三)基礎
- Android Socket 通訊Android
- 【死磕NIO】— NIO基礎詳解
- Java IO學習筆記四:Socket基礎Java筆記
- socket通訊的建立
- socket.IO通訊
- 程式間通訊(Socket)
- Java面試必問通訊框架NIO,原理詳解Java面試框架
- Socket網路程式設計基礎與實踐:建立高效的網路通訊程式設計
- 網路通訊基礎
- 程序間通訊基礎
- Java IO 和 NIOJava
- socket.io通訊原理
- 簡單的Socket通訊
- java socket 通訊socketServer 服務端多執行緒JavaServer服務端執行緒
- Java:基於TCP協議網路socket程式設計(實現C/S通訊)JavaTCP協議程式設計
- QT硬體通訊基礎QT
- Android Socket連線,使用Socket進行通訊(Android)Android
- 計算機基礎-Socket計算機
- Socket程式設計基礎程式設計
- 現代通訊技術基礎中的基礎
- Linux學習/TCP Socket通訊LinuxTCP
- socket 完成簡單的通訊
- Socket.IO IM通訊元件元件
- koa-socket即時通訊
- 溫故之.NET Socket通訊
- 網路通訊技術基礎
- 即時通訊技術文集(第9期):Java NIO和Netty入門系列 [共19篇]JavaNetty
- Java入門系列-25-NIO(實現非阻塞網路通訊)Java
- 【socket程式設計基礎模板】程式設計