Python сокет связи TCP с подпроцессом на ROS - PullRequest
0 голосов
/ 26 марта 2020

Я пытался отправить / получить большое изображение захвата видео через 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, теперь он выводит «Соединение отказано»

...