Python tcp協議
阿新 • • 發佈:2018-11-23
Python tcp協議
tcp通訊模型中,在通訊開始之前,一定要先建立相關的連結,才能傳送資料,類似於生活中,“打電話”"
tcp伺服器
要完成一個tcp伺服器的功能,需要的流程如下:
- socket建立一個套接字
- bind繫結ip和port
- listen使套接字變為可以被動連結
- accept等待客戶端的連結
- recv/send接收發送資料
一個很簡單的tcp伺服器如下:
#coding=utf-8 from socket import * # 建立socket tcpSerSocket = socket(AF_INET, SOCK_STREAM) # 繫結本地資訊 address = ('', 7788) tcpSerSocket.bind(address) # 使用socket建立的套接字預設的屬性是主動的,使用listen將其變為被動的,這樣就可以接收別人的連結了 tcpSerSocket.listen(5) # 如果有新的客戶端來連結伺服器,那麼就產生一個新的套接字專門為這個客戶端伺服器 # newSocket用來為這個客戶端服務 # tcpSerSocket就可以省下來專門等待其他新客戶端的連結 newSocket, clientAddr = tcpSerSocket.accept() # 接收對方傳送過來的資料,最大接收1024個位元組 recvData = newSocket.recv(1024) print '接收到的資料為:',recvData # 傳送一些資料到客戶端 newSocket.send("thank you !") # 關閉為這個客戶端服務的套接字,只要關閉了,就意味著為不能再為這個客戶端服務了,如果還需要服務,只能再次重新連線 newSocket.close() # 關閉監聽套接字,只要這個套接字關閉了,就意味著整個程式不能再接收任何新的客戶端的連線 tcpSerSocket.close()
tcp客戶端
#coding=utf-8 from socket import * # 建立socket tcpClientSocket = socket(AF_INET, SOCK_STREAM) # 連結伺服器 serAddr = ('192.168.1.102', 7788) tcpClientSocket.connect(serAddr) # 提示使用者輸入資料 sendData = raw_input("請輸入要傳送的資料:") tcpClientSocket.send(sendData) # 接收對方傳送過來的資料,最大接收1024個位元組 recvData = tcpClientSocket.recv(1024) print '接收到的資料為:',recvData # 關閉套接字 tcpClientSocket.close()
應用:模擬QQ聊天
客戶端參考程式碼
#coding=utf-8 from socket import * # 建立socket tcpClientSocket = socket(AF_INET, SOCK_STREAM) # 連結伺服器 serAddr = ('192.168.1.102', 7788) tcpClientSocket.connect(serAddr) while True: # 提示使用者輸入資料 sendData = raw_input("send:") if len(sendData)>0: tcpClientSocket.send(sendData) else: break # 接收對方傳送過來的資料,最大接收1024個位元組 recvData = tcpClientSocket.recv(1024) print 'recv:',recvData # 關閉套接字 tcpClientSocket.close()
伺服器端參考程式碼
#coding=utf-8
from socket import *
# 建立socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM)
# 繫結本地資訊
address = ('', 7788)
tcpSerSocket.bind(address)
# 使用socket建立的套接字預設的屬性是主動的,使用listen將其變為被動的,這樣就可以接收別人的連結了
tcpSerSocket.listen(5)
while True:
# 如果有新的客戶端來連結伺服器,那麼就產生一個信心的套接字專門為這個客戶端伺服器
# newSocket用來為這個客戶端服務
# tcpSerSocket就可以省下來專門等待其他新客戶端的連結
newSocket, clientAddr = tcpSerSocket.accept()
while True:
# 接收對方傳送過來的資料,最大接收1024個位元組
recvData = newSocket.recv(1024)
# 如果接收的資料的長度為0,則意味著客戶端關閉了連結
if len(recvData)>0:
print 'recv:',recvData
else:
break
# 傳送一些資料到客戶端
sendData = raw_input("send:")
newSocket.send(sendData)
# 關閉為這個客戶端服務的套接字,只要關閉了,就意味著為不能再為這個客戶端服務了,如果還需要服務,只能再次重新連線
newSocket.close()
# 關閉監聽套接字,只要這個套接字關閉了,就意味著整個程式不能再接收任何新的客戶端的連線
tcpSerSocket.close()