日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

你对Java网络编程了解的如何?Java BIO 网络编程 | Netty 前期知识

發布時間:2025/3/19 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你对Java网络编程了解的如何?Java BIO 网络编程 | Netty 前期知识 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一步一步走來,之前去學習了JUC并發編程知識,現在終于到Java IO網絡編程啦,難啊。

一、BIO介紹

引入: 隨著技術的發展,兩個或以上的程序必然需要進行交互,于是提供了一種端到端的通信,相當于對傳輸層的一種封裝,對于開發人員而言隱藏了傳輸的細節,將這些固定的“套路”抽象出來,提供一種端到端的通信,可以使我們更加專注于業務的開發。而BIO只是其中一種。

Java BIO (old )就是傳統的 Java I/O 編程,其相關的類和接口在 java.io,另外Java BIO是同步并阻塞(傳統阻塞型),服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理。效率較低,資源容易被浪費。

阻塞和非阻塞

阻塞和非阻塞指的是執行一個操作是等操作結束再返回,還是馬上返回。

比如餐館的服務員為用戶點菜,當有用戶點完菜后,服務員將菜單給后臺廚師,此時有兩種方式:

  • 第一種:就在出菜窗口等待,直到廚師炒完菜后將菜送到窗口,然后服務員再將菜送到用戶手中;(阻塞方式)
  • 第二種:等一會再到窗口來問廚師,某個菜好了沒?如果沒有先處理其他事情,等會再去問一次;(非阻塞的)

二、BIO模型

流程分析:

  • 首先需要啟動一個ServerSocket服務端,用來供客戶端連接
  • 然后再啟動ClientSocket客戶端,與服務器進行連接通信。(注:默認情況下,每個客戶端與服務端都是單獨的一個線程通信,不管使用不使用)
  • 在客戶端發出請求后,會先詢問服務器端是否可以有線程響應,有以下兩種結果:
    • 如若有線程響應,客戶端會阻塞等待請求結束后,再繼續執行;
    • 假如沒有線程響應則會等待響應,或者直接被拒絕
  • 三、代碼案例

    1)案例:

    我們使用BIO模型寫一個服務器端,監聽8888端口,當有客戶端連接時,就啟動一個線程與它通訊。

    編程思路:

  • 創建一個線程池
  • 創建ServerSocket對象 服務器套接字(ServerSocket)等待通過網絡傳入的請求。
  • 如果有客戶端連接,就創建一個線程,與之通訊(單獨寫一個方法)
  • 獲得Socket對象, 用于連接通信
  • 編寫一個handler方法,和客戶端通訊,讀取客戶端發過來的信息
  • package com.crush.bio;import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.*;/*** @Author: crush* @Date: 2021-08-23 11:51* version 1.0c*/ public class BioServer {public static void main(String[] args) throws Exception {//1. 創建一個線程池ExecutorService newCachedThreadPool = new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.SECONDS,new SynchronousQueue<>(),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());//2、創建ServerSocketServerSocket serverSocket = new ServerSocket(8888);System.out.println("服務器啟動了");while (true) {System.out.println("線程信息id = " + Thread.currentThread().getId() + "名字 = " + Thread.currentThread().getName());//監聽,等待客戶端連接System.out.println("等待連接....");//3.偵聽要與此套接字建立的連接并接受它。 該方法阻塞,直到建立連接。final Socket socket = serverSocket.accept();System.out.println("連接到一個客戶端");//4、就創建一個線程,與之通訊(單獨寫一個方法)newCachedThreadPool.execute(() -> {//可以和客戶端通訊handler(socket);});}}/*** 編寫一個handler方法,和客戶端通訊,讀取客戶端發過來的信息* @param socket*/public static void handler(Socket socket) {try {System.out.println("線程信息id = " + Thread.currentThread().getId() + "名字 = " + Thread.currentThread().getName());byte[] bytes = new byte[1024];//通過socket獲取輸入流InputStream inputStream = socket.getInputStream();//循環的讀取客戶端發送的數據while (true) {System.out.println("線程信息id = " + Thread.currentThread().getId() + "名字 = " + Thread.currentThread().getName());System.out.println("read....");int read = inputStream.read(bytes);if (read != -1) {//輸出客戶端發送的數據System.out.println(new String(bytes, 0, read));} else {break;}}} catch (Exception e) {e.printStackTrace();} finally {System.out.println("關閉和client的連接");try {socket.close();} catch (Exception e) {e.printStackTrace();}}} }

    這是一個經典的每連接每線程的模型,之所以使用多線程,主要原因在于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的最大缺陷就是在于每個請求都需要創建獨立的線程進行連接通訊,這樣會造成以下幾點問題:

  • 當并發數上升到較大的時候,需要創建大量線程來處理,容易給系統造成極大的壓力,其次創建太多線程、銷毀太多線程,占用系統資源較大。
  • 如果建立連接后,當前線程任務較小,較短,然后之后沒有數據可讀,則線程會一直阻塞在Read操作上,造成資源的浪費。
  • 五、自言自語

    最近在持續更新中,如果你覺得對你有所幫助,也感興趣的話,關注我吧,讓我們一起學習,一起討論吧。

    在學習路上充滿好奇心,明白思考的重要性,是支持我一直學習下去的積極推動力吧。希望你也能喜歡上編程!😁

    熱愛生活,享受生活!!!無論在哪里,無論此時的生活多么艱難,都要記得熱愛生活!!!相信總會有光來的。

    你好,我是博主寧在春,Java學習路上的一顆小小的種子,也希望有一天能扎根長成蒼天大樹。

    希望與君共勉😁

    我們:待別時相見時,都已有所成

    總結

    以上是生活随笔為你收集整理的你对Java网络编程了解的如何?Java BIO 网络编程 | Netty 前期知识的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 精品无码国产污污污在线观看 | 人妻一区二区在线 | 日批免费网站 | 欧美黑人精品 | 波多野结衣电影在线播放 | 久久久久久久久久久久久国产 | 黄色片在线观看视频 | 成人综合在线观看 | 久久久ww| 91黄色国产| 久久免费看少妇高潮v片特黄 | 高清国产一区二区三区四区五区 | 久久aⅴ乱码一区二区三区 亚洲成人18 | 亚洲成a人 | 哪里可以免费看av | 99爱视频在线观看 | 可以在线观看的黄色 | a级片免费在线观看 | 欧美视频黄| 色xxxxx | 天天撸在线视频 | 欧美 日韩 国产 成人 | 欧美日韩国产区 | 久久天天躁狠狠躁夜夜躁 | 欧美网站在线 | 欧美午夜精品一区二区蜜桃 | 在线日韩视频 | 秋霞影院一区二区 | 四虎免看黄 | 免费av一区 | 亚洲成年人在线观看 | 麻豆网址 | 亚洲国产精华液网站w | 草久久久久 | 欧美老女人性生活视频 | 亚洲精品久久久久久久蜜桃 | 少妇被黑人到高潮喷出白浆 | 两个女人互添下身爱爱 | 国产一在线 | av片在线观看 | 中文字幕在线观看亚洲 | 日韩免费福利 | 欧美精品a区 | 欧美一级爱爱 | 精品国产乱码久久久久久浪潮 | 国产性猛交xxxx免费看久久 | 四虎免看黄 | 朋友人妻少妇精品系列 | 丰满少妇一区二区三区专区 | 色综合久久综合 | 欧美在线亚洲 | 日韩欧美中文字幕一区二区 | 国产成人精品久久久 | 日韩精品人妻无码一本 | 少妇高潮网站 | 日韩欧美少妇 | 一级成人免费 | 国产精品久久精品三级 | 亚洲图片欧美在线 | 国产人妻精品一区二区三区不卡 | 少妇又色又紧又黄又刺激免费 | 久久e热| 国产真实乱 | 哪里可以免费看毛片 | 黄色大片毛片 | 一起艹在线观看 | 国产一级淫片a视频免费观看 | 黄色小视频免费观看 | 国产精品久久久久影院 | 精品人妻一区二区三区蜜桃 | 秋葵视频污| 青青99 | 97色干| av在线免播放器 | 国产成人久久婷婷精品流白浆 | 性一交一乱一乱一视频 | 色欲国产精品一区二区 | 国产国语性生话播放 | 黄色午夜影院 | 伊人网中文字幕 | 青娱乐伊人 | 美丽的姑娘在线观看 | 69天堂网 | 亚洲高清成人 | 精品少妇一区二区三区免费观 | 日韩大尺度视频 | 97香蕉久久超级碰碰高清版 | 3p视频在线| 国产欧美熟妇另类久久久 | 亚洲精品福利在线观看 | 日韩精品中文字幕一区二区 | 小嫩嫩精品导航 | 丝袜黄色片 | 看全黄大色黄大片 | free欧美性69护士呻吟 | 疯狂做爰的爽文多肉小说王爷 | 精品人妻少妇嫩草av无码专区 | 97精品人妻一区二区三区 | 婷婷视频网 |