Java BIO
BIO通信模型
BIO通信服務端,通常有一個獨立的Acceptor線程負責監聽客戶端的連接。接收到客戶端連接請求后會為每個客戶端創建一個新的線程進行鏈路處理,處理完成后返回應答給客戶端,也就是經典的請求-應答通信模型。但是隨著客戶端并發量上升,服務端的線程數膨脹,系統性能急劇下降,最終會導致系統不可用。
Server端代碼:
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* Created by hao.g on 18/5/7.
*/
public class BioServer {
public static void main(String[] args) {
int port = 9090;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
while (true){
//如果沒有客戶端連接則阻塞
Socket socket = serverSocket.accept();
new Thread(new BioHandler(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (serverSocket != null){
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
import java.net.Socket;
/**
* Created by hao.g on 18/5/7.
*/
public class BioHandler implements Runnable{
private Socket socket;
public BioHandler(Socket socket){
this.socket = socket;
}
@Override
public void run() {
System.out.println(socket.toString());
}
}
如果沒有客戶端接入,代碼會一直阻塞在
Socket socket = serverSocket.accept();
啟動server端,通過命令jstack pid觀察線程堆棧信息,主程序確實阻塞在accept方法上
當有客戶端接入時,服務端新建一個線程處理BioHandler,打印客戶端socket相關信息。
Client端代碼:
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
/**
* Created by hao.g on 18/5/7.
*/
public class BioClient {
public static void main(String[] args) {
String host = "127.0.0.1";
int port = 9090;
Socket socket = null;
try {
socket = new Socket();
socket.connect(new InetSocketAddress(host, port));
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (socket != null){
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
可見每次有新的連接時,服務端都會創建新的線程。這種模型無法滿足高并發,高性能的場景。
智能推薦
Java IO--BIO
一、概述 網絡編程的基本模型是Client/Server模型,也就是兩個進程之間進行相互通信,其中服務端提供位置信息(ip地址及端口信息),客戶端通過連接操作向服務端監聽的地址發起連接請求,通過TCP的三次握手建立連接,如果連接建立成功,雙方就可以通過網絡套接字(Socket)進行通信。 Java體系在發展過程中,通過演變提供了不同的通信模型,它們彼此之間互不相同,模型之間性能相差巨大,使用方式也...
2、Java BIO
1、IO模型 IO模型:就是用什么樣的通道進行數據的發送和接收,很大程度上決定了程序通信的性能; Java支持3種網絡編程模式:BIO NIO AIO Java BIO 同步并阻塞(傳統阻塞型):服務器實現模式是一個連接一個線程,客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個線程不做任何事情會造成不必要的線程開銷; Java NIO 同步非阻塞。服務器實現模式為一個線程處理多個請求...
Java-BIO
Java BIO 概述 IO流的分類 文件流(節點流) 緩沖流 轉換流 標準輸入& 輸出流 打印流 數據流 對象流 隨機存取文件流 概述 全程為 Block Input/Output(同步阻塞式輸入/輸出), 指的就是傳統 IO, 是用于處理設備之間的數據傳輸. 如 讀寫文件, 網絡通訊等 數據的輸入或輸出操作是以流(Stream)的方式進行 IO流的分類 按照操作數據的單位: 字節流(8...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...