TCP協議 面向鏈接 可靠的 面向字節流形式的python
tcp是基於連接的,必須先啓動服務端,而後再啓動客戶端去連接服務端服務器
TCP協議編碼流程:socket
服務器端: 客戶端tcp
實例化對象 實例化對象ide
綁定IP地址和端口號 編碼
監聽spa
接收客戶端的鏈接 鏈接服務器3d
收發 收發code
關閉 關閉對象
解決方法:
#加入一條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()