通過python實現TCP在客戶端和伺服器上的單(多)執行緒的程式設計
阿新 • • 發佈:2018-11-08
1、只支援一個客戶端訪問
伺服器:
from socket import * address='127.0.0.1' #監聽哪些網路 127.0.0.1是監聽本機 0.0.0.0是監聽整個網路 port=12345 #監聽自己的哪個埠 buffsize=1024 #接收從客戶端發來的資料的快取區大小 s = socket(AF_INET, SOCK_STREAM) s.bind((address,port)) s.listen(1) #最大連線數 while True: clientsock,clientaddress=s.accept() print('connect from:',clientaddress) #傳輸資料都利用clientsock,和s無關 while True: recvdata=clientsock.recv(buffsize).decode('utf-8') if recvdata=='exit' or not recvdata: break senddata=recvdata+'from sever' clientsock.send(senddata.encode()) clientsock.close() s.close()
客戶端:
from socket import * address='127.0.0.1' #伺服器的ip地址 port=12345 #伺服器的埠號 buffsize=1024 #接收資料的快取大小 s=socket(AF_INET, SOCK_STREAM) s.connect((address,port)) while True: senddata=input('想要傳送的資料:') if senddata=='exit': break s.send(senddata.encode()) recvdata=s.recv(buffsize).decode('utf-8') print(recvdata) s.close()
2、支援多個客戶端併發訪問
伺服器:
from socket import * import threading address='127.0.0.1' #監聽哪些網路 127.0.0.1是監聽本機 0.0.0.0是監聽整個網路 port=12345 #監聽自己的哪個埠 buffsize=1024 #接收從客戶端發來的資料的快取區大小 s = socket(AF_INET, SOCK_STREAM) s.bind((address,port)) s.listen(2) #最大連線數 def tcplink(sock,addr): while True: recvdata=clientsock.recv(buffsize).decode('utf-8') if recvdata=='exit' or not recvdata: break senddata=recvdata+'from sever' clientsock.send(senddata.encode()) clientsock.close() while True: clientsock,clientaddress=s.accept() print('connect from:',clientaddress) #傳輸資料都利用clientsock,和s無關 t=threading.Thread(target=tcplink,args=(clientsock,clientaddress)) #t為新建立的執行緒 t.start() s.close()
客戶端:
#客戶端與上一個沒有任何改變
from socket import *
address='127.0.0.1' #伺服器的ip地址
port=12345 #伺服器的埠號
buffsize=1024 #接收資料的快取大小
s=socket(AF_INET, SOCK_STREAM)
s.connect((address,port))
while True:
senddata=input('想要傳送的資料:')
if senddata=='exit':
break
s.send(senddata.encode())
recvdata=s.recv(buffsize).decode('utf-8')
print(recvdata)
通過python實現TCP服務的客戶端和伺服器的程式設計,從單執行緒到多執行緒,主要區別是伺服器的程式設計,客戶端的程式設計基本不變。伺服器通過建立新的執行緒實現多執行緒的程式設計。