Netty - I/O模型之BIO
生活随笔
收集整理的這篇文章主要介紹了
Netty - I/O模型之BIO
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- I/O模型的定義
- BIO
- Demo Server
- Demo Client
- Demo Run
- BIO 同步阻塞模型
- 小結
I/O模型的定義
什么是I/O模型呢? 簡單來說就是說用什么樣的通道進行數據的發送和接收。
在Java中,共支持3種網絡編程IO模式:BIO,NIO,AIO
BIO
Demo Server
package com.artisan.iomodel.bio;import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/1/16 22:23* @mark: show me the code , change the world*/ public class SocketServer {public static void main(String[] args) throws IOException {ServerSocket serverSocket = new ServerSocket(7777);while (true) {System.out.println("等待client連接....");//阻塞方法Socket clientSocket = serverSocket.accept();System.out.println("已收到客戶端的連接....,開始處理");handler(clientSocket);/*new Thread(new Runnable() {@Overridepublic void run() {try {handler(clientSocket);} catch (IOException e) {e.printStackTrace();}}}).start();*/}}private static void handler(Socket clientSocket) throws IOException {byte[] bytes = new byte[1024];System.out.println("準備讀取客戶端發送來的數據");//接收客戶端的數據,阻塞方法,沒有數據可讀時就阻塞int read = clientSocket.getInputStream().read(bytes);System.out.println("讀取ing");if (read != -1) {System.out.println("接收到客戶端的數據:" + new String(bytes, 0, read));}// 向服務端發送數據clientSocket.getOutputStream().write("HelloClient".getBytes());// 緩沖區刷新clientSocket.getOutputStream().flush();} }Demo Client
package com.artisan.iomodel.bio;import java.io.IOException; import java.net.Socket;/*** @author 小工匠* @version 1.0* @description: TODO* @date 2021/1/16 22:27* @mark: show me the code , change the world*/ public class SocketClient {public static void main(String[] args) throws IOException {Socket socket = new Socket("localhost", 7777);//向服務端發送數據socket.getOutputStream().write("HelloServer".getBytes());socket.getOutputStream().flush();System.out.println("向服務端發送數據結束");byte[] bytes = new byte[1024];//接收服務端回傳的數據socket.getInputStream().read(bytes);System.out.println("接收到服務端的數據:" + new String(bytes));socket.close();} }Demo Run
啟動 Server,
然后啟動Client
同時看下Server的數據
我們用cmd工具來連一下 , telnet 127.0.0.1 7777
回車,輸入 ctrl + ]
作為客戶端發送消息
查看server是否收到
BIO 同步阻塞模型
通過上面的例子,可以看到 一個客戶端連接對應一個處理線程
上面的線程模型 可以看到 只有一個main線程在處理,如果當前main線程沒有處理完,后,后面的請求是無法被處理的 。
當然了我們上面的是一個線程的, 也可以改造為多線程 。
new Thread(new Runnable() {@Overridepublic void run() {try {handler(clientSocket);} catch (IOException e) {e.printStackTrace();}}}).start();就變成了下面這種模式
小結
缺點顯而易見
- read操作是阻塞操作,如果連接不做數據讀寫操作會導致線程阻塞,浪費資源
- 每個請求都需要開辟一個線程去處理,開辟過多的線程勢必會導致服務器資源緊張。
BIO 方式適用于連接數目比較小且固定的架構, 這種方式對服務器資源要求比較高, 但程序簡單易理解。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的Netty - I/O模型之BIO的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解分布式技术 - 漫谈分布式事务及
- 下一篇: Netty - I/O模型之NIO