你对Java网络编程了解的如何?Java BIO 网络编程 | Netty 前期知识
一步一步走來,之前去學習了JUC并發編程知識,現在終于到Java IO網絡編程啦,難啊。
一、BIO介紹
引入: 隨著技術的發展,兩個或以上的程序必然需要進行交互,于是提供了一種端到端的通信,相當于對傳輸層的一種封裝,對于開發人員而言隱藏了傳輸的細節,將這些固定的“套路”抽象出來,提供一種端到端的通信,可以使我們更加專注于業務的開發。而BIO只是其中一種。
Java BIO (old )就是傳統的 Java I/O 編程,其相關的類和接口在 java.io,另外Java BIO是同步并阻塞(傳統阻塞型),服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理。效率較低,資源容易被浪費。
阻塞和非阻塞:
阻塞和非阻塞指的是執行一個操作是等操作結束再返回,還是馬上返回。
比如餐館的服務員為用戶點菜,當有用戶點完菜后,服務員將菜單給后臺廚師,此時有兩種方式:
- 第一種:就在出菜窗口等待,直到廚師炒完菜后將菜送到窗口,然后服務員再將菜送到用戶手中;(阻塞方式)
- 第二種:等一會再到窗口來問廚師,某個菜好了沒?如果沒有先處理其他事情,等會再去問一次;(非阻塞的)
二、BIO模型
流程分析:
- 如若有線程響應,客戶端會阻塞等待請求結束后,再繼續執行;
- 假如沒有線程響應則會等待響應,或者直接被拒絕
三、代碼案例
1)案例:
我們使用BIO模型寫一個服務器端,監聽8888端口,當有客戶端連接時,就啟動一個線程與它通訊。
編程思路:
這是一個經典的每連接每線程的模型,之所以使用多線程,主要原因在于socket.accept()、socket.read()、socket.write()三個主要函數都是同步阻塞的,當一個連接在處理I/O的時候,系統是阻塞的,如果是單線程的話必然就掛死在那里;但CPU是被釋放出來的,開啟多線程,就可以讓CPU去處理更多的事情。
2)測試步驟:
打開cmd命令輸入telnet localhost 8888
會進入到telnet頁面
然后在telnet 命令窗口中按下 CTRL+]
發送信息命令 是 send 信息
控制臺輸出
客戶端:
客戶端我也有寫的哈😁
package com.crush.bio;import java.io.PrintStream; import java.net.Socket; import java.util.Scanner;public class BIOEchoClient {public static void main(String[] args) throws Exception{Socket client = new Socket("localhost",8888);PrintStream out = new PrintStream(client.getOutputStream());boolean flag = true;while (flag){Scanner scanner = new Scanner(System.in);String inputData = scanner.nextLine().trim();out.println(inputData);if ("byebye".equalsIgnoreCase(inputData)){flag = false;System.out.println("和客戶端說再見拉!!!");}}client.close();} }這個測試就不說了哈,這個蠻簡單的。
3)可能會出現的問題
我們使用telnet命令來測試,默認Windows這個命令是關閉的,就會出現和我一樣的問題。
打開方式:打開控制面板,點程序,然后再點這個進行選擇。
四、BIO存在的缺陷
BIO的最大缺陷就是在于每個請求都需要創建獨立的線程進行連接通訊,這樣會造成以下幾點問題:
五、自言自語
最近在持續更新中,如果你覺得對你有所幫助,也感興趣的話,關注我吧,讓我們一起學習,一起討論吧。
在學習路上充滿好奇心,明白思考的重要性,是支持我一直學習下去的積極推動力吧。希望你也能喜歡上編程!😁
熱愛生活,享受生活!!!無論在哪里,無論此時的生活多么艱難,都要記得熱愛生活!!!相信總會有光來的。
你好,我是博主寧在春,Java學習路上的一顆小小的種子,也希望有一天能扎根長成蒼天大樹。
希望與君共勉😁
我們:待別時相見時,都已有所成。
總結
以上是生活随笔為你收集整理的你对Java网络编程了解的如何?Java BIO 网络编程 | Netty 前期知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java设计模式-中介者模式
- 下一篇: 你对Java网络编程了解的如何?Java