[TOC]
> 說起905.4王國,Socket家族可謂功不可沒。可以這么說,沒有Socket家族的技術背景,905.4王國根本無從談起。
本節總結一下,我們在學習Socket編程的時候,需要知道的一些基礎性概念。
## 一、什么是 socket?
socket 的原意是“插座”,在計算機通信領域,socket 被翻譯為“套接字”,它是計算機之間進行通信的一種約定或一種方式。通過socket這種約定,一臺計算機可以接收其他計算機的數據,也可以向其他計算機發送數據。
socket 的典型應用就是Web服務器和瀏覽器:瀏覽器獲取用戶輸入的 URL,向服務器發起請求,服務器分析接收到的 URL,將對應的網頁內容返回給瀏覽器,瀏覽器再經過解析和渲染,就將文字、圖片、視頻等元素呈現給用戶。
### Socket通訊的基礎流程
```[sequence]
client->>server: ①Can you help me?然后client會進入到阻塞狀態
server->>server: ②Got!處理一些業務邏輯
server->>client: ③result is xxxxx
```
### 緩沖區(Buffer)
每個 socket 被創建后,都會分配兩個緩沖區,輸入緩沖區和輸出緩沖區。

這些I/O緩沖區特性可整理如下:
- I/O緩沖區在每個TCP套接字中單獨存在;
- I/O緩沖區在創建套接字時自動生成;
- 即使關閉套接字也會繼續傳送輸出緩沖區中遺留的數據;
- 關閉套接字將丟失輸入緩沖區中的數據。
### 單播、廣播、多播
- 單播。所謂的單播大多數都是點對點式的網絡,如打開網頁、發送郵件和兩人網絡聊天等情況,都是在使用點對點方式傳輸數據。
- 廣播。廣播是一種一對多的形式,是對網絡中所有的計算機發送數據,不區分目標,這就極易造成網絡中存在大量無用的垃圾通信數據,造成“廣播風暴”,使網絡變慢,嚴重時網絡會徹底癱瘓。
- 多播也稱為組播,它也是一種一對多的網絡。從組播的名字來看,它可以對某些計算機分配多播類型的IP地址以進行分組,然后只針對這些計算機發送數據,這就是多播。
## 二、Socket的基礎操作
實現基礎的Socket通信,我們需要核心關注兩個類的使用:
- ServerSocket:ServerSocket類作用是搭建Socket的服務端環境;
- Socket:Socket類的主要作用是使Server與Client進行通信。
### ServerSocket類
> ServerSocket類作用是搭建Socket的服務端環境。
**構造函數**
構造參數backlog
- 主要作用就是允許接受客戶端連接請求的個數。其本質是設置最大等待隊列長度,如果隊列已滿,則拒絕該連接。
- 默認值50。
```java
public ServerSocket(int port,int backlog) ;
```
### Socket
> Socket類的主要作用是使Server與Client進行通信。
**常用方法**
- `public void bind (SocketAddress bindpoint)`,作用將套接字綁定到本地地址,否則系統將自動分配端口號。
- `connect()`方法,連接方法,用于客戶端與服務端建立連接。
**示例代碼**
服務端:
```java
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 服務端與客戶端成功地進行通信
* Created by zihan on 2021/4/26.
* connect to cowboy2014@qq.com
*/
public class BeginServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
//結束socket通信
socket.close();
//關閉socket服務
serverSocket.close();
System.out.println("server closed!");
}
}
```
客戶端:
```java
/**
* Created by zihan on 2021/5/28.
* connect to cowboy2014@qq.com
*/
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
socket.bind(new InetSocketAddress("127.0.0.1",7777));
socket.connect(new InetSocketAddress("127.0.1.1",8888));
socket.close();
System.out.println("client closed!");
}
}
```
- 第一章 開篇寄語
- 1-1 技術選型要點
- 1-2 認識905.4王國的交流規范
- 1-3 聯系作者
- 第二章 Socket編程的基礎知識
- 2-1 Socket家族的基石
- 2-2 byte數組基礎
- 2-3 緩沖區基礎
- 2-4 NIO Socket通訊的工作原理
- 第三章 905.4規范解讀
- 3-1 基于通道選擇器的Socket長連接及消息讀寫框架
- 3-2 嚴格的信件收發員
- 3-3 負責消息處理的一家子
- 3-4 負責認證的大兒子(AuthWorker)
- 3-5 啞巴老二(PingWoker)
- 3-6 勤奮的定位匯報員老三(LocationReportWorker)
- 3-7 精明的老四(BusinessReportWorker)
- 3-8 數據檢察官——CRC16-CCITT校驗
- 3-11 數據的加密官
- 3-12 頭尾標識轉義
- 第四章 測試方法
- 4-1 測試數據樣例
- 4-2 客戶端鏈路保持功能實現
- 4-3 使用Socket短連接進行功能測試
- 4-4 NIO服務端性能分析
- 4-5 http測試方法(推薦)
- 第五章 從NIO到netty
- 5-1 編程進階——Netty核心基礎
- 5-2 Netty使用常見問題
- 5-3 使用Netty重寫Server端
- 5-4 Netty之鏈路管理
- 5-5 netty堆外內存泄漏如何應對?
- 第六章 統計與監控
- 6-1 Grafana監控面板
- 第七章 售后服務
- 7-1 勘誤與優化
- 7-2 獲取源碼