1. 程式人生 > >通過python實現TCP在客戶端和伺服器上的單(多)執行緒的程式設計

通過python實現TCP在客戶端和伺服器上的單(多)執行緒的程式設計

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服務的客戶端和伺服器的程式設計,從單執行緒到多執行緒,主要區別是伺服器的程式設計,客戶端的程式設計基本不變。伺服器通過建立新的執行緒實現多執行緒的程式設計。