下面直接用代碼來說明TCP協議的基礎知識:
服務器端代碼塊:
from socket import * from time import ctime ''' 指定主機地址、工作端口號、接收緩存的長度 服務器端的HOST為空,表示它可以使用任意可用的地址 ''' HOST='' PORT=21263 BUFSIZ=1024 ADDR=(HOST,PORT) # 創建套接字 ,把套接字綁定到服務器地址,開啟TCP監聽 tcpSvrSock=socket(AF_INET,SOCK_STREAM) tcpSvrSock.bind(ADDR) tcpSvrSock.listen(5) while True: ''' 不斷等待接收客戶端的連接。我們通過accept() 獲取到客戶端的tcpCliSock和addr,於是后續可以通過這個 tcpCliSock專門處理該客戶端的事務(從而與其他請求的客戶端區分開來) ''' tcpCliSock,addr=tcpSvrSock.accept() print('內容來自:',addr) # print('tcpCliSock:',tcpCliSock) while True: data=tcpCliSock.recv(BUFSIZ) if not data: break # 不為空則把消息解析出來,添加時間戳 data=data.decode('utf-8') print(data) data1=input('回復客戶端:') respMsg='[%s]%s'%(ctime(),data1) # 過重新編碼成ASCII字節后,通過send()發送回去給客戶端 tcpCliSock.send(bytes(respMsg,'utf-8')) tcpCliSock.close() tcpSvrSock.close()
客戶端代碼塊:
from socket import * ''' 指定主機地址、工作端口號、接收緩存的長度 這里的HOST為服務器端所在主機的地址,由於我是在本地進行通信測試的, 所以地址設置為127.0.0.1(localhost)。在實際網絡通信的時候,根據 具體的情況進行相應的修改。客戶端填寫的PORT必須與服務器填寫的PORT 對應才能正常通信。 ''' HOST='127.0.0.1' PORT=21263 BUFSIZ=1024 ADDR=(HOST,PORT) # 創建套接字 ,主動調用並通過connect()連接到服務器。 tcpCliSock=socket(AF_INET,SOCK_STREAM) tcpCliSock.connect(ADDR) while True: data=input('>>>') if not data: break tcpCliSock.send(bytes(data,'utf-8')) if not data: break # 接收服務器返回的數據 rscData=tcpCliSock.recv(BUFSIZ) print(rscData.decode('utf-8')) tcpCliSock.close() ''' 如果我們想要將代碼改成相應的ipv6的形式, 我們只需要把HOST改成“::1”,sock_family改成AF_INET6即可。 '''
更多詳細內容可以參見:https://blog.csdn.net/sinat_36645384/article/details/79128137