Как повторно подключить клиент ZeroMQ к серверу?Python

Программы на Python
Ответить
Anonymous
 Как повторно подключить клиент ZeroMQ к серверу?

Сообщение Anonymous »

Я только начал использовать библиотеку Python ZeroMQ, pyzmq==27.1.0.
Я работаю на Raspberry Pi 5 (debian 12 — книжный червь)
Я хочу быть уверен, что мой клиент повторно подключится, если мой сервер остановится и перезапустится. Когда я сначала запускаю сервер, он работает нормально. Но если я сначала запущу клиент или сервер остановится и перезапустится, клиент не подключится.
Я надеялся, что он может автоматически повторно подключиться, но у меня это не сработало. Я продолжаю пытаться отправить и получаю

Операцию невозможно выполнить в текущем состоянии

даже при перезапуске сервера.

Код: Выделить всё

import time
import zmq

class Test:
def __init__(self):
context = zmq.Context()
self._socket = context.socket(zmq.REQ)

# Suggested settings for auto-reconnect
self._socket.setsockopt(zmq.LINGER, 0)
self._socket.setsockopt(zmq.RECONNECT_IVL, 1000)
self._socket.setsockopt(zmq.RECONNECT_IVL_MAX, 5000)

self._socket.connect(f"tcp://localhost:5555")

def request(self, request: str) -> str:
try:
self._socket.send(request.encode())

#  Get the reply.
if self._socket.poll(1000, zmq.POLLIN):
message = self._socket.recv()
else:
raise Exception("Machine control service is not responding")
return message.decode()
except Exception as ex:
print("ERROR", ex)

def run():
control = Test()

while True:
reply = control.request("READALL")
print("Received reply:", reply)
time.sleep(1)

if __name__ == "__main__":
run()
Я попробовал отключиться и повторно подключиться, но даже когда сервер не работает, клиент успешно подключается, но не может отправить сообщение. Затем, когда сервер снова запускается, он по-прежнему не может отправить сообщение.

Код: Выделить всё

    def __init__(self):
self._connection_string = f"tcp://localhost:{SERVER_PORT}"
context = zmq.Context()
self._socket = context.socket(zmq.REQ)
self._socket_connected = False
self._gpio_input_states = ""

def _connect(self):
if not self._socket_connected:
print("connect")
self._socket.connect(self._connection_string)
self._socket_connected = True
print("connected!!!!!")

def _disconnect(self):
if self._socket_connected:
print("disconnect")
self._socket.disconnect(self._connection_string)
self._socket_connected = False

def request(self, request: str) -> str:
try:
self._connect()
self._socket.send(request.encode())

#  Get the reply.
if self._socket.poll(1000, zmq.POLLIN):
message = self._socket.recv()
else:
raise Exception("Machine control service is not responding")
return message.decode()
except Exception as ex:
self._disconnect()
raise MachineControlInterfaceException(f"Failed to send request to machine control service. Reason: {ex}")
Можно ли это сделать? Что я делаю не так?


Подробнее здесь: https://stackoverflow.com/questions/797 ... -to-server
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»