1.老生长谈:
这个问题的来源还是项目,要求局域网下一个server处理多个client收发数据请求。
为每个client创建一个进程,用于处理数据。
2.python代码:
server:
#!/usr/bin/python
# -*-coding:utf-8 -*-
from socket import *
import threading
import struct
address='192.168.0.105' #本机ip
port=6644 #端口,自定义
s = socket(AF_INET, SOCK_STREAM)
s.bind((address,port))
s.listen(5) #最大连接数
print("Waiting for connecting...")
def tcplink(sock,addr):
while True:
recvdatalen=struct.unpack('i',sock.recv(4))[0]
recvdata=sock.recv(recvdatalen).decode('utf-8')
if recvdata=='exit' or not recvdata:
print(f"{addr} have leaved")
break
print(f"from {addr} receive {recvdata}")
senddata=recvdata+'from server'
#编码
senddata=senddata.encode('utf-8')
#确定数据长度
senddatalen=len(senddata)
#打包长度
senddatalen1=struct.pack('i',senddatalen)
#发送长度
sock.send(senddatalen1)
#发送数据
sock.send(senddata)
sock.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()
client:
#!/usr/bin/python
# -*-coding:utf-8 -*-
from socket import *
from time import ctime
import struct
HOST = '192.168.0.105' #服务端ip
PORT = 6644 #服务端端口号
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM) #创建socket对象
tcpCliSock.connect(ADDR) #连接服务器
while True:
senddata = input()
#编码
senddata = senddata.encode('utf-8')
#确定数据长度
senddatalen=len(senddata)
#打包长度
senddatalen1=struct.pack('i',senddatalen)
if not senddata:
break
#发送长度
tcpCliSock.send(senddatalen1)
#发送数据
tcpCliSock.send(senddata)
#接收长度
recvdatalen=struct.unpack('i',tcpCliSock.recv(4))[0]
#接收数据
recvdata=tcpCliSock.recv(recvdatalen)
if not recvdata:
break
print(recvdata.decode('utf-8'))
tcpCliSock.close() #关闭客户端
3.结果:
4.最后:进步!