成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java網絡編程菜鳥進階:TCP和套接字入門

開發 后端
JDK 提供了對 TCP(Transmission Control Protocol,傳輸控制協議)和 UDP(User Datagram Protocol,用戶數據報協議)這兩個數據傳輸協議的支持。本文開始探討TCP。

JDK 提供了對 TCP(Transmission Control Protocol,傳輸控制協議)和 UDP(User Datagram Protocol,用戶數據報協議)這兩個數據傳輸協議的支持。本文開始探討 TCP。

TCP 基礎知識

在“服務器-客戶端”這種架構中,服務器和客戶端各自維護一個端點,兩個端點需要通過網絡進行數據交換。TCP 為這種需求提供了一種可靠的流式連接,流式的意思是傳出和收到的數據都是連續的字節,沒有對數據量進行大小限制。一個端點由 IP 地址和端口構成(專業術語為“元組 {IP 地址, 端口}”)。這樣,一個連接就可以由元組 {本地地址, 本地端口, 遠程地址, 遠程端口} 來表示。

連接過程

在 TCP 編程接口中,端點體現為 TCP 套接字。共有兩種 TCP 套接字:主動和被動,“被動”狀態也常被稱為“偵聽”狀態。服務器和客戶端利用套接字進行連接的過程如下:

1、服務器創建一個被動套接字,開始循環偵聽客戶端的連接。

2、客戶端創建一個主動套接字,連接服務器。

3、服務器接受客戶端的連接,并創建一個代表該連接的主動套接字。

4、服務器和客戶端通過步驟 2 和 3 中創建的兩個主動套接字進行數據傳輸。

下面是連接過程的圖解:

TCP 連接

一個簡單的 TCP 服務器

JDK 提供了 ServerSocket 類來代表 TCP 服務器的被動套接字。下面的代碼演示了一個簡單的 TCP 服務器(多線程阻塞模式),它不斷偵聽并接受客戶端的連接,然后將客戶端發送過來的文本按行讀取,全文轉換為大寫后返回給客戶端,直到客戶端發送文本行 bye:

  1. public class TcpServer implements Runnable {   
  2.     private ServerSocket serverSocket;   
  3.     
  4.     public TcpServer(int port) throws IOException {   
  5.         // 創建綁定到某個端口的 TCP 服務器被動套接字。   
  6.         serverSocket = new ServerSocket(port);   
  7.     }   
  8.     
  9.     @Override 
  10.     public void run() {   
  11.         while (true) {   
  12.             try {   
  13.                 // 以阻塞的方式接受一個客戶端連接,返回代表該連接的主動套接字。   
  14.                 Socket socket = serverSocket.accept();   
  15.                 // 在新線程中處理客戶端連接。   
  16.                 new Thread(new ClientHandler(socket)).start();   
  17.             } catch (IOException ex) {   
  18.                 ex.printStackTrace();   
  19.             }   
  20.         }   
  21.     }   
  22. }   
  23.     
  24. public class ClientHandler implements Runnable {   
  25.     private Socket socket;   
  26.     
  27.     public ClientHandler(Socket socket) {   
  28.         this.socket = Objects.requireNonNull(socket);   
  29.     }   
  30.     
  31.     @Override 
  32.     public void run() {   
  33.         try (Socket s = socket) {  // 減少代碼量的花招……   
  34.             // 包裝套接字的輸入流以讀取客戶端發送的文本行。   
  35.             BufferedReader in = new BufferedReader(new InputStreamReader(   
  36.                     s.getInputStream(), StandardCharsets.UTF_8));   
  37.             // 包裝套接字的輸出流以向客戶端發送轉換結果。   
  38.             PrintWriter out = new PrintWriter(new OutputStreamWriter(   
  39.                     s.getOutputStream(), StandardCharsets.UTF_8), true);   
  40.     
  41.             String line = null;   
  42.             while ((line = in.readLine()) != null) {   
  43.                 if (line.equals("bye")) {   
  44.                     break;   
  45.                 }   
  46.     
  47.                 // 將轉換結果輸出給客戶端。   
  48.                 out.println(line.toUpperCase(Locale.ENGLISH));   
  49.             }   
  50.         } catch (IOException ex) {   
  51.             ex.printStackTrace();   
  52.         }   
  53.     }   
  54. }  

阻塞模式的編程方式簡單,但存在性能問題,因為服務器線程會卡死在接受客戶端的 accept() 方法上,不能有效利用資源。套接字支持非阻塞模式,現在暫時略過。

一個簡單的 TCP 客戶端

JDK 提供了 Socket 類來代表 TCP 客戶端的主動套接字。下面的代碼演示了上述服務器的客戶端:

  1. public class TcpClient implements Runnable {   
  2.     private Socket socket;   
  3.     
  4.     public TcpClient(String host, int port) throws IOException {   
  5.         // 創建連接到服務器的套接字。   
  6.         socket = new Socket(host, port);   
  7.     }   
  8.     
  9.     @Override 
  10.     public void run() {   
  11.         try (Socket s = socket) {  // 再次減少代碼量……   
  12.             // 包裝套接字的輸出流以向服務器發送文本行。   
  13.             PrintWriter out = new PrintWriter(new OutputStreamWriter(   
  14.                     s.getOutputStream(), StandardCharsets.UTF_8), true);   
  15.             // 包裝套接字的輸入流以讀取服務器返回的文本行。   
  16.             BufferedReader in = new BufferedReader(new InputStreamReader(   
  17.                     s.getInputStream(), StandardCharsets.UTF_8));   
  18.     
  19.             Console console = System.console();   
  20.             String line = null;   
  21.             while ((line = console.readLine()) != null) {   
  22.                 if (line.equals("bye")) {   
  23.                     break;   
  24.                 }   
  25.     
  26.                 // 將文本行發送給服務器。   
  27.                 out.println(line);   
  28.                 // 打印服務器返回的文本行。   
  29.                 console.writer().println(in.readLine());   
  30.             }   
  31.     
  32.             // 通知服務器關閉連接。   
  33.             out.println("bye");   
  34.         } catch (IOException ex) {   
  35.             ex.printStackTrace();   
  36.         }   
  37.     }   
  38. }  

從 JDK 文檔可以看到,ServerSocket 和 Socket 在初始化的時候,可以設定一些參數,還支持延遲綁定。這些東西對性能和行為都有所影響。后續兩篇文章將分別詳解這兩個類的初始化。

原文鏈接:http://www.blogjava.net/shinzey/archive/2012/01/04/367846.html

【編輯推薦】

  1. 三個類似Sinatra的Java框架介紹
  2. Java調用C/C++編寫的第三方dll動態鏈接庫
  3. 深入理解JavaScript之強大的原型和原型鏈
  4. 制作完整的Java可執行文件
  5. Apache Camel 2.9.0發布 Java規則引擎
責任編輯:林師授 來源: 蜀山兆孨龘的博客
相關推薦

2014-12-11 09:20:30

TCP

2015-05-28 10:47:38

Unix網絡編程TCP

2015-10-16 09:33:26

TCPIP網絡協議

2014-12-17 09:22:10

網絡·安全技術周刊

2015-03-31 11:24:02

2021-02-05 15:20:06

網絡安全套接字命令

2014-12-15 09:28:54

UDP

2009-03-10 13:59:41

C#套接字編程

2021-03-14 18:22:23

套接字網絡通信

2010-07-06 15:33:10

UDP套接字

2013-12-27 13:39:23

Java套接字

2019-04-08 08:44:10

TCPIP網絡協議

2020-10-15 19:10:05

LinuxAPI函數

2021-12-12 18:15:06

Python并發編程

2015-04-24 09:48:59

TCPsocketsocket編程

2012-09-24 15:13:50

C#網絡協議TCP

2019-09-18 20:07:06

AndroidTCP協議

2019-06-04 09:00:00

Linux進程進程間通信

2011-12-15 09:40:06

Javanio

2019-08-26 09:50:15

TCP連接Socket
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠干天天干 | 亚洲成人精品在线 | 日韩中文一区二区三区 | 国产成人免费视频 | 日韩在线视频一区二区三区 | 久久精品久久久久久 | 日韩影院一区 | 国产精品久久久久久久久久久久冷 | 欧美一级免费 | 一区二区三区免费在线观看 | 国产精品久久久久久久久久久久久 | 久久色视频 | 一区二区三区精品视频 | 久久久一区二区三区四区 | 视频一区 国产精品 | 在线观看成人av | 欧美乱人伦视频 | 亚洲精品白浆高清久久久久久 | 日韩2020狼一二三 | 亚洲精品欧美一区二区三区 | 欧美日韩亚洲系列 | 不卡视频一区二区三区 | 精品久久国产 | 精品福利在线 | 日韩精品视频在线 | 精品一区二区三区91 | 免费看国产一级特黄aaaa大片 | 一区二区三区免费观看 | 成人国产综合 | 欧美福利在线 | 丁香婷婷综合激情五月色 | 国产一区| 福利精品在线观看 | 成人一区二区三区视频 | 最新中文字幕第一页视频 | 亚洲日本激情 | 日韩高清国产一区在线 | 懂色tv| 日韩视频区 | 一本综合久久 | 欧美大片在线观看 |