Socket
兩個應用程式的通信
- 人通過「電話」可以通信
- 應用程序通過「Socket」來通信
Socket(孔/插座/網路介面/套接字) 就是程序間的電話機
- 我和你打電話,電話,規定好的語言
- 電腦和電腦進行聯繫,Socket,Http協議
在internet上有很多這樣的主機,這些主機一般都運行了很多個服務軟體,同時提供幾種服。每個服務都打開一個Socket,並綁定到一個端口Port上,不同的端口Port對應於不同的服務(應用程式)。
例如:http 使用 80 Port、ftp 使用 21 Port、smtp 使用 25 Port
1
2
3
4
5
我 手機 打電話給 你(需要電話號碼)
客戶端 Socket 連接 服務端-資料庫(需要IP+Port)
手機=Socket
IP地址+Port端口號=電話號碼
我打電話給你,我們兩個都需要有手機,就像是客戶庫要連接服務器需要Socket.
我想要打電話給你,這麼多的名單中,只要有明確的電話號碼就可以播號給你。
我客戶端想要連接你服務器(ip)中某個資料庫(port),需要透過Socket,明確的給IP地址+Port端口號。所以:IP地址和Port端口號相當於電話號碼. IP地址+Port端口號=電話號碼
為什麼一定要有端口號Port? 因為你Server上可能會有很多的應用程式,它的IP位置都是一樣的,你要找到這個應用程式,就一定要有一個Port端口號。(區分應用程式要用端口號Port)
客戶端 & 服務器(Client & Server)
客戶端連接服務器
客戶端連接服務器需要什麼?
- 服務器的IP地址
- 應用程序:IP地址
- 數據庫:IP地址
- 端口號:區分應用程式要用端口號Port http 80, ftp 21, smtp 25
我們用 50000以後肯定錯不了
服務器
首先,服務器這邊應該要有一個負責監聽的Socket,監聽著(IP地址+Port端口號)有沒有人連過來。
有人連過來了=> 創建一個負責跟客戶端通信的Socket,跟誰通信,跟客戶端通信的。
現在服務器有幾個Socket了?
2個:
- 負責監聽的Socket:負責監聽本機的應用程式的ip地址跟port號,看沒有客戶端連過來
- 負責通信的Socket:有人連過來了,就創建一個負責跟客戶端通信的Socket
而客戶端從始至終,就只有一個Socket
★★★ 所以,服務器端最少要寫2個Socket:一個負責監聽的,一個負責通信的。
但是,在此之前,還有一個過程: 先記好兩個概念: 兩個協議:TCP & UDP
流式Socket(Stream Socket)
如果是用TCP協議的,就要用流式Socket。
是一種面向連接的Socket,安全,但效率低。數據報式Socket(Datagram Socket)
如果是用UDP協議的,就要用數據報式Socket。
是一種無連接的Socket,不安全(數據丟失、順序混亂,在接收端要分析重排及要求重發),但效率高。
TCP效率低安全(需要三次握手)
安全、穩定、效率低
什麼是三次握手?
就是客戶要發數據前,首先給你發一個訊息:你有空嗎?這時候服務器收到訊息了,回給客戶端:我有空,這是第二次,第三次呢?客戶端再回給服務端:我知道你有空了。
三次握手的過程目的是什麼?確定服務器有時間
我客戶端數據如果發過去,你服務器必須一定要給我接到,必須響應給我。
如果服務器忙錄的話,它可以不能馬上響應給你,這時候就有可能會造成數據丟失。
什麼叫數據丟失呀?我發給你,你沒接,你在處理別的事情,你沒接,那我發給你的數據,不就相當於丟失了。
而建立好三次握手之後,三次握手就確定服務器有時間,這三次握手只要有一次失敗,這個數據就發不過去,一旦三次握手都成功了,數據發過去了,服務器肯定會接到。
這種方式就是數據不會丟失、比較安全,一定收得到,但效率就低,因為每次都要經過三次握手。
UDP效率高不安全(容易數據丟失)
UDP效率高,因為我也不管你有空沒空,我就發給你。
UDP效率高,因為他有訊息就發,不管服務器是否在忙,如果服務器忙錄的話,它可以不能馬上響應給你,這時候就有可能會造成數據丟失。
UDP常用在傳輸視頻上,因為看視頻都不希望卡卡的,都希望看流暢點,畫面有點糊沒關係