• pyqt5 + socket 实现客户端A经socket服务器中转后主动向客户端B发送文件


    任务目标:

    现在客户端A有一个xml文件,客户端B希望客户端A发送文件后直接拿到xml解析后的Json数据。

    我理解的是: 客户端A→服务器(解析XML后转发Json)→客户端B

    实现效果:

    【pyqt5+socket】实现客户端A经socket服务器中转后主动向客户端B发送文件

    代码:(源码:源码链接

    socket服务器代码:

    1. #! /usr/bin/env python3
    2. import xmltodict
    3. from socket import *
    4. ###接收客户端A的信息,进行数据处理,并返回校验数据
    5. def server1(ip, port):
    6. # 创建socket
    7. tcp_server_socket = socket(AF_INET, SOCK_STREAM)
    8. # 服务器ip与端口
    9. address = (ip, port)
    10. # 绑定
    11. tcp_server_socket.bind(address)
    12. # 设置监听数.
    13. tcp_server_socket.listen(5)
    14. client_socket, clientAddr = tcp_server_socket.accept()
    15. # print(str(client_socket.recv(1024),"gbk"))
    16. # 接收对方发送过来的数据,和udp不同返回的只有数据
    17. recv_data_str = client_socket.recv(1024).decode('gbk') # 接收1024个字节,
    18. recv_data_json = xmltodict.parse(recv_data_str)
    19. global recv_data_jsonToStr
    20. # 需要转发的信息数据进行处理(符合目标格式)
    21. recv_data_jsonToStr = str(recv_data_json)
    22. # 接收到数据,返回信息校验(向客户端A返回信息)
    23. # print(data2)
    24. client_socket.send("已收到A".encode())
    25. # 关闭连接
    26. client_socket.close()
    27. # 将处理之后的数据转发给客户端B
    28. def server2(ip, port):
    29. tcp_server_socket = socket(AF_INET, SOCK_STREAM)
    30. address = (ip, port)
    31. tcp_server_socket.bind(address)
    32. tcp_server_socket.listen(2)
    33. client_socket, clientAddr = tcp_server_socket.accept()
    34. # 调用server1, 客户端A连接的端口为19005
    35. server1('172.20.10.2', 19005)
    36. # 判断是否接收到信息,如果不是空,则转发到客户端B
    37. if recv_data_jsonToStr:
    38. client_socket.send(recv_data_jsonToStr.encode("gbk"))
    39. # 接收客户端B的返回信息
    40. # recv_data = client_socket.recv(1024).decode('utf-8') # 接收1024个字节,
    41. # print('接收到的数据为:', recv_data.decode('utf-8'))
    42. # 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
    43. client_socket.close()
    44. if __name__ == "__main__":
    45. while (1): # 服务端始终运行
    46. server2('172.20.10.2', 19004) # 客户端B请求端口为19004
    47. # time.sleep(20)

    客户端A代码:

    1. import sys,time,os,json
    2. from PyQt5.Qt import *
    3. from PyQt5 import QtWidgets,QtGui
    4. from clientA_pane import clientAPane
    5. from socket import *
    6. if __name__ == '__main__':
    7. app = QApplication(sys.argv)
    8. clientA_pane = clientAPane()
    9. # splash = QtWidgets.QSplashScreen(QtGui.QPixmap('resource/images/splash.png'))
    10. # splash.show()
    11. # splash.showMessage('正在加载……')
    12. # time.sleep(2)
    13. # splash.close()
    14. clientA_pane.show()
    15. def sendFile(plainTextEdit_text):
    16. # ws = create_connection("ws://172.20.10.2:5678")
    17. with open(plainTextEdit_text[8:], 'rb') as f:
    18. data = f.read()
    19. send_data = str(data,"gbk")
    20. try:
    21. # 创建socket
    22. tcp_client_socket = socket(AF_INET, SOCK_STREAM)
    23. # 目的信息
    24. server_ip = "172.20.10.2" # 服务端ip
    25. server_port = 19005 # 端口
    26. # 链接服务器
    27. tcp_client_socket.connect((server_ip, server_port))
    28. # 向服务端发送json串
    29. tcp_client_socket.send(send_data.encode("gbk"))
    30. # # 接收服务端返回数据,最大接收1024个字节
    31. # recvData = tcp_client_socket.recv(1024)
    32. # print('接收到的数据为:', recvData.decode('gbk'))
    33. # 关闭套接字
    34. tcp_client_socket.close()
    35. except:
    36. print("另一个客户端未建立连接")
    37. clientA_pane.sendFile_signal.connect(sendFile)
    38. sys.exit(app.exec())

    客户端B代码:

    1. from socket import *
    2. import time
    3. def client():
    4. # 创建socket
    5. tcp_client_socket = socket(AF_INET, SOCK_STREAM)
    6. # 目的信息
    7. server_ip = "172.20.10.2"
    8. server_port = 19004
    9. # 链接服务器
    10. tcp_client_socket.connect((server_ip, server_port))
    11. while (1):
    12. ## 接收对方发送过来的数据,最大接收1024个字节
    13. recvData = tcp_client_socket.recv(1024).decode('gbk')
    14. print('接收到的数据为:', recvData)
    15. if recvData: # 如果接收到数据不为空
    16. tcp_client_socket.send('已接收服务器转发A的数据'.encode('gbk'))
    17. time.sleep(5)
    18. else:
    19. break
    20. # 关闭套接字
    21. tcp_client_socket.close()
    22. if __name__ == "__main__":
    23. client()

  • 相关阅读:
    LabVIEW调试技巧
    【分享】“简道云“ 在集简云平台集成应用的常见问题与解决方案
    如何解决GitHub 访问不了?小白教程
    索引的创建和设计原则
    LC-2216. 美化数组的最少删除数(贪心(脑经急转弯))
    工作记录---为什么双11当天不能申请退款?(有趣~)
    后端开发面试题5(附答案)
    【智能家居入门2】(MQTT协议、微信小程序、STM32、ONENET云平台)
    springboot redisTemplate.opsForValue().setIfAbsent返回null原理
    争议不断的AI绘画,靠啥成为了顶流?
  • 原文地址:https://blog.csdn.net/ChaoChao66666/article/details/126136329