当前位置:网站首页>pyqt5 + socket 实现客户端A经socket服务器中转后主动向客户端B发送文件
pyqt5 + socket 实现客户端A经socket服务器中转后主动向客户端B发送文件
2022-08-05 03:29:00 【Zhichao_97】
任务目标:
现在客户端A有一个xml文件,客户端B希望客户端A发送文件后直接拿到xml解析后的Json数据。
我理解的是: 客户端A→服务器(解析XML后转发Json)→客户端B
实现效果:
【pyqt5+socket】实现客户端A经socket服务器中转后主动向客户端B发送文件
代码:(源码:源码链接)
socket服务器代码:
#! /usr/bin/env python3
import xmltodict
from socket import *
###接收客户端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()
# print(str(client_socket.recv(1024),"gbk"))
# 接收对方发送过来的数据,和udp不同返回的只有数据
recv_data_str = client_socket.recv(1024).decode('gbk') # 接收1024个字节,
recv_data_json = xmltodict.parse(recv_data_str)
global recv_data_jsonToStr
# 需要转发的信息数据进行处理(符合目标格式)
recv_data_jsonToStr = str(recv_data_json)
# 接收到数据,返回信息校验(向客户端A返回信息)
# print(data2)
client_socket.send("已收到A".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()
# 调用server1, 客户端A连接的端口为19005
server1('172.20.10.2', 19005)
# 判断是否接收到信息,如果不是空,则转发到客户端B
if recv_data_jsonToStr:
client_socket.send(recv_data_jsonToStr.encode("gbk"))
# 接收客户端B的返回信息
# recv_data = client_socket.recv(1024).decode('utf-8') # 接收1024个字节,
# print('接收到的数据为:', recv_data.decode('utf-8'))
# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()
if __name__ == "__main__":
while (1): # 服务端始终运行
server2('172.20.10.2', 19004) # 客户端B请求端口为19004
# time.sleep(20)
客户端A代码:
import sys,time,os,json
from PyQt5.Qt import *
from PyQt5 import QtWidgets,QtGui
from clientA_pane import clientAPane
from socket import *
if __name__ == '__main__':
app = QApplication(sys.argv)
clientA_pane = clientAPane()
# splash = QtWidgets.QSplashScreen(QtGui.QPixmap('resource/images/splash.png'))
# splash.show()
# splash.showMessage('正在加载……')
# time.sleep(2)
# splash.close()
clientA_pane.show()
def sendFile(plainTextEdit_text):
# ws = create_connection("ws://172.20.10.2:5678")
with open(plainTextEdit_text[8:], 'rb') as f:
data = f.read()
send_data = str(data,"gbk")
try:
# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 目的信息
server_ip = "172.20.10.2" # 服务端ip
server_port = 19005 # 端口
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
# 向服务端发送json串
tcp_client_socket.send(send_data.encode("gbk"))
# # 接收服务端返回数据,最大接收1024个字节
# recvData = tcp_client_socket.recv(1024)
# print('接收到的数据为:', recvData.decode('gbk'))
# 关闭套接字
tcp_client_socket.close()
except:
print("另一个客户端未建立连接")
clientA_pane.sendFile_signal.connect(sendFile)
sys.exit(app.exec())客户端B代码:
from socket import *
import time
def client():
# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)
# 目的信息
server_ip = "172.20.10.2"
server_port = 19004
# 链接服务器
tcp_client_socket.connect((server_ip, server_port))
while (1):
## 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024).decode('gbk')
print('接收到的数据为:', recvData)
if recvData: # 如果接收到数据不为空
tcp_client_socket.send('已接收服务器转发A的数据'.encode('gbk'))
time.sleep(5)
else:
break
# 关闭套接字
tcp_client_socket.close()
if __name__ == "__main__":
client()
边栏推荐
- Web3.0 Dapps——通往未来金融世界的道路
- [GYCTF2020]EasyThinking
- How to simulate the background API call scene, very detailed!
- 2022 Hangzhou Electric Multi-School 1st Game
- IJCAI2022 | DictBert: Pre-trained Language Models with Contrastive Learning for Dictionary Description Knowledge Augmentation
- Dameng 8 database export and import
- 905. 区间选点
- Developing Hololens encountered The type or namespace name 'HandMeshVertex' could not be found..
- 数据库设计的酸(ACID)碱(BASE)原则
- 如何在WordPress中添加特定类别的小工具
猜你喜欢

.NET Application -- Helloworld (C#)

How to discover a valuable GameFi?

告白数字化转型时代,时速云镌刻价值新起点

开发Hololens遇到The type or namespace name ‘HandMeshVertex‘ could not be found..

【七夕节】浪漫七夕,代码传情。将爱意变成绚烂的立体场景,给她(他)一个惊喜!(送代码)

[TA-Frost Wolf_may-"Hundred Talents Project"] Graphics 4.3 Real-time Shadow Introduction

【已解决】Unity Coroutinue 协程未有效执行的问题

2022 High-level installation, maintenance, and removal of exam questions mock exam question bank and online mock exam

Defect detection (image processing part)

.NET应用程序--Helloworld(C#)
随机推荐
2022-08-04 The sixth group, hidden from spring, study notes
Getting Started with Kubernetes Networking
Thinking (88): Use protobuf custom options for multi-version management of data
告白数字化转型时代,时速云镌刻价值新起点
ASP.NET application--Hello World
事件解析树Drain3使用方法和解释
Use CH341A to program external Flash (W25Q16JV)
Defect detection (image processing part)
[Filter tracking] based on matlab unscented Kalman filter inertial navigation + DVL combined navigation [including Matlab source code 2019]
[Solved] Unity Coroutine coroutine is not executed effectively
冒泡排序与快速排序
从“能用”到“好用” 国产软件自主可控持续推进
银行数据采集,数据补录与指标管理3大问题如何解决?
测试薪资这么高?刚毕业就20K
From "useable" to "easy to use", domestic software is self-controllable and continues to advance
数学-求和符号的性质
36-Jenkins-Job迁移
Why is the pca component not associated
Based on holding YOLOv5 custom implementation of FacePose YOLO structure interpretation, YOLO data format conversion, YOLO process modification"
Dynamic management of massive service instances