參考了以下教程
python實現tcp服務器客戶端(支持多客戶端)
錯誤警告: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