На самом деле я работаю над тем, чтобы связать мое приложение-флаттер с экземпляром виртуальной машины Google. Я установил сервер сокетов python (код ниже) в экземпляре vm, который может взять изображение, декодировать его и затем вызвать мою модель машинного обучения. Более того, после обработки он должен закодировать изображение и отправить его обратно в мое приложение для флаттера.
Ранее я проверил свой экземпляр vm, написав код клиента также на python, где я использовал модуль ** jsonpickle **, который очень хорошо кодирует и декодирует изображение (как будто мне просто нужно сделать код jsonpickle.decode (encoded_image) ) чтобы вернуть массивный массив изображений). Теперь я хочу, чтобы мое приложение-флаттер подключилось к экземпляру vm.
Скажите, пожалуйста, какой модуль dart следует использовать, который может кодировать мои изображения и может быть отправлен через модуль IOWebSocketChannel в dart, а при получении через сервер python в экземпляре vm его можно декодировать в массив numpy. Кроме того, я могу закодировать выходное изображение на сервере Python, которое при отправке на флаттер может быть декодировано в изображение.
Вот мой реализованный client.py (Моя программа, которая успешно отправляет изображения на сервер)
from autobahn.twisted.websocket import WebSocketClientProtocol, \
WebSocketClientFactory
import main
import jsonpickle
import base64
import matplotlib.pyplot as plt
import time
class MyClientProtocol(WebSocketClientProtocol):
def onConnect(self, response):
print("Server connected: {0}".format(response.peer))
def onOpen(self):
print("WebSocket connection open.")
def hello():
# opening the image file and encoding in base64
path = "/home/abdullah/Desktop /Clocktower_Panorama_20080622_20mb.jpg"
image = main.load_image(path)
encoded = jsonpickle.encode(image)
# printing the size of the encoded image which is sent
# print("Encoded size of the sent image: {0} bytes".format(len(encoded_string)))
# sending the encoded image
self.sendMessage(encoded.encode('utf-8'))
hello()
def onMessage(self, payload, isBinary):
print("Output processed image received")
output = main.image_post_process(payload)
plt.imshow(output)
plt.show()
print("Done")
reactor.stop()
# plt.show()
def onClose(self, wasClean, code, reason):
print("WebSocket connection closed: {0}".format(reason))
if __name__ == '__main__':
time1 = time.time()
import sys
from twisted.python import log
from twisted.internet import reactor
# log.startLogging(sys.stdout)
factory = WebSocketClientFactory()
factory.protocol = MyClientProtocol
reactor.connectTCP("34.73.158.146", 5903, factory)
# reactor.connectTCP("localhost", 9933, factory)
reactor.run()
time2 = time.time()
print("Total time is ", time2-time1)
Вот мой server.py, реализованный в экземпляре vm.
rom autobahn.twisted.websocket import WebSocketServerProtocol, \
WebSocketServerFactory
# import the base64 module
import base64
import jsonpickle
import time
import main
class MyServerProtocol(WebSocketServerProtocol):
def onConnect(self, request):
print("Client connecting: {0}".format(request.peer))
def onOpen(self):
print("WebSocket connection open.")
def onMessage(self, payload, isBinary):
print("Message received")
time1_total = time.time()
#output = main.main_function(payload)
#time1 = time.time()
#encoded = main.send_image_server(output)
#time2 = time.time()
#print("Total time to process image is ", time2-time1)
# echo back message verbatim
time1 = time.time()
self.sendMessage(encoded)
time2 = time.time()
print("Total time taken to do everything is ", time2-time1_total)
def onClose(self, wasClean, code, reason):
print("WebSocket connection closed: {0}".format(reason))
if __name__ == '__main__':
import sys
from twisted.python import log
from twisted.internet import reactor
log.startLogging(sys.stdout)
factory = WebSocketServerFactory()
factory.protocol = MyServerProtocol
reactor.listenTCP(5903, factory)
reactor.run()
Вот то, что я пытаюсь в своем коде флаттера, чтобы отправить изображение через сокет, но соединение на сервере закрывается сразу после открытия:
File imageFile = new File(imageFilePath);
List<int> imageBytes = imageFile.readAsBytesSync();
String base64Image = BASE64.encode(imageBytes);
Пожалуйста, скажите мне, как я могу преодолеть это или есть ли способ, которым я могу использовать свой вышеупомянутый код client.py во флаттере, чтобы избежать сложностей.
Спасибо