Java基礎(Socket通訊和NIO)

rjr.ToString發表於2020-12-13

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();
}
  1. 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狀況

相關文章