服務端
服務器進程首先要綁定一個端口並監聽來自其他客戶端的連接。如果某個客戶端連接過來了,服務器就與該客戶端建立Socket連接,隨後的通信就靠這個Socket連接了。所以,服務器會打開固定端口(比如80)監聽,每來一個客戶端連接,就創建該Socket連接。由於服務器會有大量來自客戶端的連接,所以,服務器要能夠區分一個Socket連接是和哪個客戶端綁定的。一個Socket依賴4項:服務器地址、服務器端口、客戶端地址、客戶端端口來唯一確定一個Socket。
import socket
import sys
import _thread
def newkehu(clientsocket,addr):
print("連接地址: %s" % str(addr))
msg='歡迎新客戶'+ "\r\n"
clientsocket.send(msg.encode('gbk'))
while True:
print(clientsocket.recv(1024).decode('gbk'))
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 綁定
serversocket.bind(('192.168.99.109', 9999))
# 設置最大連接數,超過後排隊
serversocket.listen(5)
while True:
# 建立客戶端連接
clientsocket,addr = serversocket.accept()
# 新開線程
_thread.start_new_thread(newkehu,(clientsocket,addr))
#clientsocket.close()
客戶端
客戶端要主動發起TCP連接,必須知道服務器的IP地址和端口號。新浪網站的IP地址可以用域名www.sina.com.cn
自動轉換到IP地址,但是怎麼知道新浪服務器的端口號呢?答案是作爲服務器,提供什麼樣的服務,端口號就必須固定下來。由於我們想要訪問網頁,因此新浪提供網頁服務的服務器必須把端口號固定在80
端口,因爲80
端口是Web服務的標準端口。其他服務都有對應的標準端口號,例如SMTP服務是25
端口,FTP服務是21
端口,等等。端口號小於1024的是Internet標準服務的端口,端口號大於1024的,可以任意使用。
import socket
import sys
# 創建 socket 對象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 連接服務,指定主機和端口
s.connect(('192.168.99.109', 9999))
# 接收小於 1024 字節的數據
msg = s.recv(1024)
s.close()
print (msg.decode('gbk'))