TCP協議 面向連接 可靠的 面向字節流形式的
tcp是基於鏈接的,必須先啟動服務端,然后再啟動客戶端去鏈接服務端
TCP協議編碼流程:
服務器端: 客戶端
實例化對象 實例化對象
綁定IP地址和端口號
監聽
接收客戶端的連接 連接服務器
收發 收發
關閉 關閉

問題:有的同學在重啟服務端時可能會遇到

解決方法:
#加入一條socket配置,重用ip和端口 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket.socket() sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加 sk.bind(('127.0.0.1',8898)) #把地址綁定到套接字 sk.listen() #監聽鏈接 conn,addr = sk.accept() #接受客戶端鏈接 ret = conn.recv(1024) #接收客戶端信息 print(ret) #打印客戶端信息 conn.send(b'hi') #向客戶端發送信息 conn.close() #關閉客戶端套接字 sk.close() #關閉服務器套接字(可選)
tcp三次握手: 一定是client先發起請求
a 客戶端發起請求連接服務器
b 服務器返回:接收到請求,並要求連接客戶端
c 客戶端回復:可以連接
四次揮手: 誰先發起斷開連接的請求都可以
a 客戶端發起斷開連接的請求:
意思是: 我想和你斷開連接,我沒有數據要繼續發送了,但是如果你有數據需要發送,我可以繼續接收
b 服務器回復 : 我接收到你的請求了
c 服務器發送 : 我已經准備好斷開連接了
d 客戶端回復 : 收到你的信息,斷開連接
tcp實現的一個聊天室, 可以實現一對多,但是必須斷掉別人的連接, 然后才能和下一個人聊,本質還是一對一
只是創建一個死循環,讓服務器一直處於待機狀態
while 1:
conn,addr = sk.accept()
1 import socket 2 3 4 sk = socket.socket() 5 sk.bind(('127.0.0.1',8888)) 6 sk.listen() 7 8 while 1: 9 10 conn,addr = sk.accept() 11 12 msg_r = conn.recv(1024) 13 if msg_r.decode('utf-8') != 'q': 14 print(msg_r.decode('utf-8')) 15 16 else: 17 break 18 19 msg_s = input('>>>') 20 if msg_s != 'q': 21 conn.send(msg_s.encode('utf-8')) 22 else: 23 conn.send(msg_s.encode('utf-8')) 24 break
1 import socket 2 3 name = input('請輸入你的名字:\n') 4 5 sk = socket.socket() 6 sk.connect(('127.0.0.1', 8888)) 7 8 9 while 1: 10 11 msg_s = input('>>>') 12 if msg_s != 'q': 13 sk.send((name + msg_s).encode('utf-8')) 14 else: 15 sk.send(msg_s.encode('utf-8')) 16 break 17 18 msg_r = sk.recv(1024) 19 if msg_r != 'q': 20 print(msg_r.decode('utf-8')) 21 else: 22 break 23 24 sk.close()
1 import socket 2 3 name = input('請輸入你的名字:\n') 4 5 sk = socket.socket() 6 sk.connect(('127.0.0.1', 8888)) 7 8 while 1: 9 10 msg_s = input('>>>') 11 if msg_s != 'q': 12 sk.send((name + msg_s).encode('utf-8')) 13 else: 14 sk.send(msg_s.encode('utf-8')) 15 break 16 17 msg_r = sk.recv(1024) 18 if msg_r != 'q': 19 print(msg_r.decode('utf-8')) 20 else: 21 break 22 23 sk.close()
