Я пытался отправить / получить большое изображение захвата видео через tcp python сокет на ROS-мелодии c. Мне нужно использовать подпроцесс, потому что ROS-мелодия c работает на python2, но мне нужны python3 библиотеки.
У меня есть сервер и клиент.
Клиент: это узел ROS, который отправляет полученное изображение захвата видео (его тип 'список') с узла камеры после subprocess.Popen(['python3', Serverfile])
и client.connect(HOST_IP, HOST_PORT)
Сервер: Это python3 код, который получает данные и выполняет их функции, а затем отправляет новое изображение клиенту.
Вот мой код сокета.
import socket
import json
import sys
BUFSIZE = 4096
def _send(socket, send_data):
json_data = json.JSONEncoder().encode(send_data)
socket.sendall(json_data.encode())
def _recv(socket):
recv_data = socket.recv(BUFSIZE)
json_data = json.loads(recv_data.decode())
return json_data
class Server(object):
backlog = 1
client = None
def __init__(self, host, port):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Error for using port
self.socket.bind((host, port))
self.socket.listen(self.backlog)
def __del__(self):
self.close()
def accept(self):
if self.client:
self.client.close()
self.client, self.client_addr = self.socket.accept()
return self
def send(self, data):
if not self.client:
raise Exception('Cannot send data, no client is connected.')
_send(self.client, data)
return self
def recv(self):
if not self.client:
raise Exception('Cannot receive data, no client is connected.')
return _recv(self.client)
def close(self):
if self.client:
self.client.close()
self.client = None
if self.socket:
self.socket.close()
self.socket =None
class Client(object):
socket = None
def __init__(self):
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def __del__(self):
self.close()
def connect(self, host, port):
self.socket.connect((host, port))
return self
def send(self, data):
if not self.socket:
raise Exception('You have to connect first before sending data.')
_send(self.socket, data)
return self
def recv(self):
if not self.socket:
raise Exception('You have to connect first before receiving data.')
return _recv(self.socket)
def close(self):
if self.socket:
self.socket.close()
self.socket = None
При использовании socket.SOCK_DGRAM
выводится сообщение «Слишком длинное сообщение». Так что я изменил socket.SOCK_STREAM
, теперь он выводит «Соединение отказано»