实现过程
考虑到实际连接设备在得到服务端的指令后要结合硬件执行不同的操作,因此需要客户端每次连接服务端时,应该连接同一个端口,即分配一个固定端口;在服务端创建两个线程用来连接两个客户端,并为两个端口分配固定的端口,同时为了线程之间能够直接共享信息,所以使用全局变量的方式进行两个线程中参数的传递。
在一个进程内的所有线程共享全局变量,能够在不使用其他方式的前提下完成多线程之间的数据共享。
服务端程序:
from socket import *
from threading import Thread # 导入线程
###接收客户端A的信息,进行数据处理,并返回校验数据
def server1(ip, port):
# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
# 服务器ip与端口
address = (ip, port)
# 绑定
tcp_server_socket.bind(address)
# 设置监听数.
tcp_server_socket.listen(5)
client_socket, clientAddr = tcp_server_socket.accept()
while True:
# 接收对方发送过来的数据,和udp不同返回的只有数据
recv_data = client_socket.recv(1024).decode('utf-8') # 接收1024个字节,
global num
# 需要转发的信息数据进行处理(符合目标格式)
num = int(recv_data)
print('接收的站点为', num)
# 接收到数据,返回信息校验(向客户端A返回信息)
client_socket.send(f'服务端接收到了信息 {str(num)}'.encode())
# 关闭连接
client_socket.close()
# 将处理之后的数据转发给客户端B
def server2(ip, port):
tcp_server_socket = socket(AF_INET, SOCK_STREAM)
address = (ip, port)
tcp_server_socket.bind(address)
tcp_server_socket.listen(2)
client_socket, clientAddr = tcp_server_socket.accept()
while True:
# 判断是否接收到信息,如果不是空,则转发到客户端B
if num==1:
client_socket.send(str(num).encode())
# 接收客户端B的返回信息
# recv_data = client_socket.recv(1024).decode('utf-8') # 接收1024个字节,
# print('接收到的数据为:', recv_data.decode('utf-8'))
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()
# 主函数运行
num=0
if __name__ == "__main__":
#while (1): # 服务端始终运行
t1 = Thread(target=server1,args=('127.0.0.1', 19005)) # 实例化线程t1
t2 = Thread(target=server2,args=('127.0.0.1', 19004)) # 实例化线程t2
t1.start() # 开启线程t1
t2.start() # 开启线程t2
# time.sleep(20)
客户端A连接服务端的19005端口。
客户端A程序:
from socket import *
def client():
# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 目的信息
server_ip = "127.0.0.1" # 服务端ip
server_port = 19005 # 端口
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
while True:
# 从终端读入用户输入的字符串
data = input('>>> ')
if data == 'exit':
break
tcp_client_socket.send(data.encode('utf-8'))
# 接收服务端返回数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode())
# 关闭套接字
tcp_client_socket.close()
if __name__ == "__main__":
client()
客户端B连接服务端的19004端口。如果客户端A到达1站点,客户端B会接收到服务端的数据。
客户端B程序:
from socket import *
def client():
# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 目的信息
server_ip = "127.0.0.1"
server_port = 19004
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
while True:
## 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
info_num = int(recvData.decode()) # 将字符型转化为数值型
if info_num == 1:
print('接收到的数据为:',f'{info_num}')
#if recvData: # 如果接收到数据不为空
# tcp_client_socket.send('1111'.encode('utf-8'))
# time.sleep(5)
#else:
#break
# 关闭套接字
tcp_client_socket.close()
if __name__ == "__main__":
client()
打开服务端然后打开客户端A和客户端B
参考文献:
python实现同一个服务器对应多个客户端进行通信