套接字編程是一種連接網絡上的兩個節點以相互通信的方法。一個套接字(節點)偵聽 IP 處的特定端口,而另一個套接字則伸向另一個套接字以形成連接。服務器形成偵聽器套接字,而客戶端則連接到服務器。
他們是網頁浏覽背後的真正支柱。簡單來說,有一個服務器和一個客戶端。
套接字編程是通過導入套接字庫並創建一個簡單的套接字來開始的。
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
在這裡,我們制作了一個套接字實例,並向它傳遞了兩個參數。第一個參數為AF_INET,第二個參數為SOCK_STREAM。AF_INET是指地址系列 ipv4。SOCK_STREAM表示面向連接的 TCP 協議。
現在,我們可以使用此套接字連接到服務器。
請注意,如果在創建套接字期間發生任何錯誤,則為套接字。錯誤被拋出,我們只能通過知道其IP連接到服務器。您可以使用以下命令查找服務器的IP:
$ ping www.google.com
你也可以使用python找到IP:
import socket
ip = socket.gethostbyname('www.google.com')
print(ip)
輸出結果:
下面是用於連接到 Google 的腳本示例。
import socket
import sys
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("已成功創建套接字")
except socket.error as err:
print("套接字創建失敗,出現錯誤 %s" % (err))
# 套接字默認端口
port = 80
try:
host_ip = socket.gethostbyname('www.google.com')
except socket.gaierror:
print("解析主機時出錯")
sys.exit()
# 連接到服務器
s.connect((host_ip, port))
print("套接字已成功連接到google")
運行結果:
服務器有一個 bind() 方法,該方法將其綁定到特定的 IP 和端口,以便它可以偵聽該 IP 和端口上的傳入請求。服務器有一個 listen() 方法,它將服務器置於偵聽模式。這允許服務器偵聽傳入連接。最後,服務器有一個 accept() 和 close() 方法。accept 方法啟動與客戶端的連接,close 方法關閉與客戶端的連接。
# 首先導入套接字庫
import socket
# 接下來創建套接字對象
s = socket.socket()
print ("已成功創建套接字")
# 在您的計算機上保留一個端口在我們的情況下是12345,但可以是任何端口
port = 12345
#接下來綁定到端口,我們沒有在ip字段中鍵入任何ip,而是輸入了一個空字符串,這使服務器偵聽來自網絡上其他計算機的請求
s.bind(('', port))
print ("套接字綁定到 %s" %(port))
# 切換套接字到監聽模式
s.listen(5)
print ("套接字正在偵聽")
# 一個永遠的循環,直到我們中斷它或發生錯誤
while True:
# 與客戶端建立連接。
c, addr = s.accept()
print ('已從獲得連接', addr )
# 向客戶發送感謝信息。編碼以發送字節類型。
c.send('感謝您的連接'.encode())
# 關閉與客戶端的連接
c.close()
# 打破循環
break
現在我們需要一些服務器可以與之交互的東西。我們可以像這樣信奉服務器,只是為了知道我們的服務器正在工作。在終端中鍵入以下命令:
# 啟動服務器
$ python server.py
# 保持上述端子打開
# 現在打開另一個終端並鍵入:
$ telnet localhost 12345
如果報以下錯誤:
可以在控制面板中點擊啟用或關閉windows功能中找到telent 客戶端 並勾選 點擊確定
輸出:
# #在服務器中。py端子您將看到以下輸出:
已成功創建套接字
套接字綁定到 12345
套接字正在偵聽
Got connection from ('127.0.0.1', 52617)
# 在telnet終端中,您將看到:
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
感謝您的連接.
此輸出顯示我們的服務器正在工作。
現在對於客戶端:
# 導入socket 模塊
import socket
# 船艦socket 對象
s = socket.socket()
# 定義要連接的端口
port = 12345
# 連接到本地計算機上的服務器
s.connect(('127.0.0.1', port))
# 從服務器接收數據並解碼以獲取字符串。
print(s.recv(1024).decode())
# 關閉連接
s.close()
運行結果: