田小花語音機器人(五)python使用socke模塊建立多客戶端鏈接同一個服務器

參考了以下教程
python實現tcp服務器客戶端(支持多客戶端)

PYTHON SOCKET編程詳細介紹

錯誤警告:socketserver OSError: [Errno 98] Address already in use

客戶端和服務器端實現以下功能:

1、服務器端通過建立子線程來服務客戶端發送過來的數據;
2、客戶端每向服務器端發送一個數據,服務器都會把接收到數據傳遞回來。

服務器端程序:

#!/usr/bin/python3.7
# coding=utf-8
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(5)     #最大連接數

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()

客戶端程序:

#!/usr/bin/python3.7
# coding=utf-8
#客戶端與上一個沒有任何改變
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()

運行結果:
客戶端

想要發送的數據:hi
hifrom sever
想要發送的數據:

服務器端

connect from: ('127.0.0.1', 49218)

在運行過程中需要注意一些問題
在終端直接運行輸入就會報錯!!!!

2333333333

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章