现在客户端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()