Тайм-аут соединения сокета при отправке массивов через сокеты на другой компьютер - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть массив Numpy.В моем коде я хочу отправить numy ndarray через сокеты, и я реализовал это.Он полностью функционирует, когда я использую его между клиентским и серверным сокетами, которые размещены на моем ПК, хотя при попытке отправить ndarray как клиент на сервер на другом ПК он не работает и показывает «тайм-аут» -ошибка сокета.

Я думаю, что все сделал правильно, хотя.Вот как я построил свой код:

  1. Клиент отправляет первое сообщение для установления соединения.

  2. Сервер отправляет обратно, что он готов кполучить данные.

  3. Клиент отправляет numpy ndarray в виде байтов, а также сообщение 'translation_over'.

  4. Сервер отправляет обратно то, что получил данные.

    # Client side:
    client_socket.send(data_to_send.encode()) -> Some headers.
    received_data = client_socket.recv(1024) -> Receive data from server.
    print('What I received after sending headers (1): ', received_data.decode())
    client_socket.send(data.tobytes()) -> Sending the ndarray as bytes.
    client_socket.send("transmission_over".encode())
    received_data = client_socket.recv(1024) -> Receive data from server.
    print('What I received after sending the data (2): ', received_data.decode())
    print('sent data!')
    
    # Server side:
    def receive_numpy_array(connection):
        received_bytes = ''.encode()
        while True:
          raw_data = connection.recv(1024)
          if raw_data == 'transmission_over'.encode():
              break
          received_bytes += raw_data
        np_array_from_bytes = np.frombuffer(received_bytes, dtype=np.uint64).reshape((8192,))
        return np_array_from_bytes
    
    raw_data = connection.recv(1024) -> Receive headers.
    connection.send("HOST >>> YOU: Ready to receive data!".encode()) -> Sending back that server is ready.
    np_array = receive_numpy_array(connection) -> Receiving & constructing ndarray.
    connection.send("HOST >>> YOU: Received your data segment!".encode()) -> Sending back confirmation.
    

При попытке использовать этот код, когда клиент находится на одном ПК, а сервер на другом, он не работает и показывает ошибку, что время ожидания сокета внутри функции receive_numpy_array истекло.

При тестировании на моем собственном ПК и на клиенте, и на сервере все работает нормально, и я успешно получаю массив numpy.

Так почему этот код работает только при использованииодна и та же машина для клиента и сервера и как это исправить?

Заранее спасибо!

1 Ответ

0 голосов
/ 24 декабря 2018

Рассматривая это абстрактно, вы должны включить переадресацию портов в маршрутизаторе и соответственно настроить iptables системы, может помочь вам в деталях, при условии типа операционной системы, сети, к которой они подключены,(при подключении к одному или разным маршрутизаторам / сети)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...