1.Socket相關概念
(1) Socket的英文原義是“孔”或者“插座”,作為進程通訊機制,取後一種意思,通常也稱作“通訊端”,用於藐視IP地址和連接埠,是一個通訊鏈的控制代碼(其實就是兩個程式通訊用的)。
(2) Socket非常類似於電話插座,以一個電話網為例,電話的通話雙方相當於相互連信的2個程式,電話號碼就是IP地址,任何使用者在通話之前,首先要佔有一部電話機,相當於申請一個Socket;同時要知道對方的電話號碼,相當於對方有一個固定的Socket,然後向對方撥號呼叫,相當於發出串連請求,對方假如在場並且空閑,拿起電話話筒,雙方就可以正式通話,相當於串連成功,雙方通話的過程,是一方向電話機發出訊號和對方從電話機接收訊號的過程,相當於向Socket發送資料和從Socket接收資料,通話結束後,一方掛起電話機相當於關閉Socket,撤銷串連
(3) 在Internet上面有很多這樣的主機,這些主機一般運行了多個服務軟體,同時提供幾種服務,每種服務都開啟一個Socket,並綁定到一個連接埠上,不同的連接埠對應於不同的服務(應用程式)。
(4) 例如:http使用80連接埠,ftp使用21連接埠,smtp使用23連接埠。
(5) 有兩種類型的Socket
1) 流式Socket(Stream)
是一種連線導向的Socket,針對於連線導向的TCP服務應用,安全,但是效率低。
2) 資料報式Socket(Datagram)
是一種不需連線的Socket,對應於不需連線的UDP服務應用,不安全(丟失,順序混亂,在接收端要分析重排及要求重發),但是效率高。
2. Socket一般應用模式(伺服器端和用戶端)
(1) ,分析圖示:
(2) 說明:
1) 服務端welcoming socket開始監聽連接埠(負責監聽用戶端串連資訊)。
2) 用戶端client socket串連服務端指定連接埠(負責接收和發送伺服器端訊息)
3) 伺服器端監聽到用戶端串連,建立connection socket(負責和用戶端通訊)
(3) 伺服器端的Socket(至少需要兩個)
1) 一個負責接收用戶端串連請求(但不負責和用戶端通訊)
2) 每成功接收到一個用戶端的串連便在伺服器端產生一個對應的Socket。
1) 在接收到用戶端串連時建立
2) 為每個串連成功的用戶端請求在伺服器端都建立一個對應的Socket(負責和用戶端通訊)。
(4) 用戶端的Socket
1)用戶端Socket
1) 必須指定要已連線的服務器端地址和連接埠。
2) 通過建立一個Socket對象來初始化一個到伺服器端的TCP串連。
- Socket的通訊過程
(1) 伺服器端
1) 申請一個Socket。
2) 綁定到一個IP地址和一個連接埠上。
3) 開啟偵聽,等待接收資料。
(2) 用戶端
1) 申請一個Socket。
2) 串連伺服器(指明IP地址和連接埠號碼)
3) 伺服器端串連到串連請求後,產生一個新的Socket(連接埠大於1024)於用戶端建立串連並進行通訊,原偵聽Socket繼續偵聽。:
- Socket的建構函式
(1) 串連通過建構函式完成
(2) public Socket(AddressFamily address,SocketType socket,ProtocolType protocol)
1) AddressFamily成員指定Socket用來解析地址的定址方案。例如:
InterNetWork相當於Socket使用一個IP版本4地址串連。
2) SocketType定義要開啟的Socket的類型。
3) Socket類使用ProtocolType枚舉向Windows Socket API通知所請求的協議
如:mySocket=new Socket(AddressFamily.InterNetWork,SocketType.Stream,ProtocolType.TCP);
(3) 注意:
1) 至少要定義一個要串連的遠程主機的IP和連接埠號碼
2) 連接埠號碼必須為1和65535之間,最好在1024之後。
3) 要串連的遠程主機必須正在監聽指定連接埠,也就是說你無法隨意串連遠程主機。
如:IPAddress addr=IPAddress.Parse(10.10.4.200);
IPEndPoint endp=new IPEndPoint(addr,10001);
服務端先綁定:serverWelcomeSocket.Bind(endp);
用戶端在串連:ClientSocket.Connect(endp);
- Socket的方法
(1) 相關類
1) IPAddress類:包含了一個IP地址
2) IPEndPoint類:包含了一對IP地址和連接埠號碼
(2) 相關方法
1) Socket():建立一個Socket。
2) Bind():綁定一個本地的IP和連接埠號碼(IPEndPoint)
3) Listen():讓Socket偵聽傳入的串連嘗試,並指定偵聽隊列容量。
4) Connect():初始化與另外一個Socket的串連。
5) Accept():接收串連並且返回一個新的Socket。
6) Send():輸出資料到Socket。
7) Receive():從Socket中讀取資料。
8) Close():關閉Socket(銷毀串連)