从客户端选择一张图片发送给服务器保存。 要求: 客户端:采用Qt5实现界面,先选择一张要发送的图片,然后点击“发送”按钮发送图片文件名和图片,通过thrift RPC方式通信 服务器:将接收到的图片保存。保存成功提示:保存图片成功,保存的文件名称为客户端发送的文件名称。通过thrift RPC方式通信.用python语言写
时间: 2024-02-09 16:12:01 浏览: 55
以下是一个简单的实现,包括客户端和服务器端的代码。需要注意的是,这只是一个简单的示例,实际生产环境中需要考虑很多问题,比如错误处理、安全性、性能等等。
客户端代码:
```python
import sys
from PyQt5 import QtWidgets, QtGui
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from ImageTransfer import ImageTransfer
class MyWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# 创建文件选择对话框,选择要发送的图片文件
filePath, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open Image File", "", "Images (*.png *.xpm *.jpg *.bmp)")
if not filePath:
sys.exit()
# 创建 RPC 客户端
transport = TSocket.TSocket("localhost", 9090)
transport = TTransport.TBufferedTransport(transport)
protocol = TBinaryProtocol.TBinaryProtocol(transport)
self.client = ImageTransfer.Client(protocol)
try:
# 连接 RPC 服务器
transport.open()
# 打开图片文件
with open(filePath, "rb") as f:
imageData = f.read()
# 发送图片文件名和数据到服务器
self.client.uploadImage(filePath.split("/")[-1], imageData)
# 关闭连接
transport.close()
QtWidgets.QMessageBox.information(self, "Info", "Image sent successfully.")
except TTransport.TTransportException as e:
QtWidgets.QMessageBox.critical(self, "Error", "Failed to send image: " + str(e))
sys.exit()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = MyWindow()
sys.exit(app.exec_())
```
服务器端代码:
```python
import sys
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
from ImageTransfer import ImageTransfer
class ImageTransferHandler(ImageTransfer.Iface):
def uploadImage(self, fileName, imageData):
# 保存图片文件
with open(fileName, "wb") as f:
f.write(imageData)
print("Image saved to file", fileName)
if __name__ == "__main__":
try:
# 创建 RPC 服务器
handler = ImageTransferHandler()
processor = ImageTransfer.Processor(handler)
transport = TSocket.TServerSocket(port=9090)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
print("Server started")
# 启动服务器
server.serve()
except Exception as e:
print("Error:", e)
sys.exit(1)
```
需要注意的是,这里使用了 Thrift 的 TSimpleServer,它是一个简单的单线程服务器,适合测试和演示。在实际生产环境中,应该使用更强大的服务器,比如 TThreadedServer 或 TThreadPoolServer。
阅读全文