套接字(socket)基本知識與工作原理
一、Socket相關概念
????Socket通常也稱作“套接字”,用于描述IP地址和端口,是一個通信鏈的句柄。(其實就是兩個程序通信用的。)
????SOCKET用于在兩個基于TCP/IP協議的應用程序之間相互通信。最早出現在UNIX系統中,是UNIX系統主要的信息傳遞方式。在WINDOWS系統中,SOCKET稱為WINSOCK。兩個基本概念:客戶方和服務方。當兩個應用之間需要采用SOCKET通信時,首先需要在兩個應用之間(可能位于同一臺機器,也可能位于不同的機器)建立SOCKET連接,發起呼叫連接請求的一方為客戶方,接受呼叫連接請求的一方成為服務方。客戶方和服務方是相對的,同一個應用可以是客戶方,也可以是服務方。在客戶方呼叫連接請求之前,它必須知道服務方在哪里。所以需要知道服務方所在機器的IP地址或機器名稱,如果客戶方和服務方事前有一個約定就好了,這個約定就是PORT(端口號)。也就是說,客戶方可以通過服務方所在機器的IP地址或機器名稱和端口號唯一的確定方式來呼叫服務方。在客戶方呼叫之前,服務方必須處于偵聽狀態,偵聽是否有客戶要求建立連接。一旦接到連接請求,服務方可以根據情況建立或拒絕連接。連接方式有兩種,同步方式(Blocking)和(noBlocking).客戶方發送的消息可以是文本,也可以是二進制信息流。當客戶方的消息到達服務方端口時,會自動觸發一個事件(event),服務方只要接管該事件,就可以接受來自客戶方的消息了。
?
二、Socket有兩種類型:
- ?流式Socket(STREAM):是一種面向連接的Socekt,針對面向連接的TCP服務應用,安全,但是效率低;
- ?數據報式Socket(DATAGAM):是一種無連接的Socket,對應于無連接的UDP服務應用。不安(丟失,順序混亂,在接受端要分析重排及要求重發),但效率高。
三、Socket一般應用模式(服務端和客戶端)

?
服務端的Socket(至少需要兩個):
- 一個負責接受客戶端連接請求(但不負責與客戶端通信)
- 每成功接收到一個客戶端的連接便在服務端產生一個對應的Socket
- 再接受到客戶端連接時創建。
- 為每個連接成功的客戶端請求在服務端都創建一個對應的Socket(負責和客戶端通信)。
客戶端的Socket
- 客戶端Socket
- 必須指定要連接的服務端地址和端口。
- 通過創建一個Socket對象來初始化一個到服務端的TCP連接。
?
Socket通信基本流程圖

?
?
Socket的通信過程
服務端:
- 申請一個Socket
- 綁定到一個IP地址和一個端口
- 開啟偵聽,等待接受連接
客戶端:
- 申請一個Socket
- 連接服務器(指明IP地址和端口號)
????服務器端接到連接請求后,產生一個新的Socket(端口大于1024)與客戶端建立連接并進行通訊,原偵聽Socket繼續偵聽。