Я пытаюсь отправить и получить данные с помощью TCP-соединения с помощью Python. Мой сервер и клиент находятся в том же файле, который определяется и используется следующим образом.Ошибка Python: [Errno 111] Соединение отклонено
В конструкторе я определяю сервер как:
self.sock_in = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock_in.bind((self.host_ip, self.host_port))
self.sock_in.listen(1)
Не беспокойтесь о host_ip и host_port переменных, они все в порядке.
В функции, я пытаюсь отправить следующие данные:
sock_out = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP Connection
sock_out.connect((self.remote_ip, self.remote_port))
sock_out.send(self.navigation_data.get_message())
sock_out.close()
И это мое главное:
def main(self):
rospy.logwarn("Starting...")
while not rospy.is_shutdown():
conn = self.sock_in.accept()
try:
recv_buffer = conn.recv(BUFFERSIZE_IN)
if recv_buffer != "":
msg = recv_buffer.decode('utf-8')
msg_type = msg[:msg.find(',')]
if msg_type == self.pilot_control.MESSAGE_ID:
self.pilot_control_handler(msg, self.pilot_control_publisher)
else:
rospy.logwarn("Received an unimplemented message type '%s'", msg_type)
except socket.error as socket_error:
rospy.logerr("SocketError: %s", str(socket_error))
И ошибка я получаю:
line 230, in send_83b_package
sock_out.connect((self.remote_ip, self.remote_port))
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
error: [Errno 111] Connection refused
Я поместил несколько команд печати, чтобы увидеть, где они сбрасываются, и, по-видимому, он не запускает команду accept. Пока я не вижу команды печати, но после метода accept ничего не печатается, что означает, что он обрушивается там.
Я подозреваю, что проблема связана с синхронизацией. То есть сервер не запускается достаточно быстро.
Любые мысли?
EDIT: Одно из предложений было запустить сервер на отдельном потоке, который я попытался следующим образом:
def my_tcp_server(self):
# Establish a TCP Connection
self.sock_in = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock_in.bind((self.host_ip, self.host_port))
self.sock_in.listen(1)
rospy.logwarn("ready")
while not rospy.is_shutdown():
rospy.logwarn("before accept")
conn, address = self.sock_in.accept()
rospy.logwarn("after accept")
try:
recv_buffer = conn.recv(BUFFERSIZE_IN)
rospy.logwarn("recv works!")
if recv_buffer != "":
msg = recv_buffer.decode('utf-8')
msg_type = msg[:msg.find(',')]
if msg_type == self.pilot_control.MESSAGE_ID:
self.pilot_control_handler(msg, self.pilot_control_publisher)
else:
rospy.logwarn("Received an unimplemented message type '%s'", msg_type)
except socket.error as socket_error:
rospy.logerr("SocketError: %s", str(socket_error))
conn.close()
def main(self):
rospy.logwarn("Starting..")
threading.Thread(target=self.my_tcp_server).start()
И в моем конструкторе, порядок вызовов следующим образом:
self.main()
self.sendDataFunction()
Что должно быть в порядке. Однако функция accept все еще не работает, поэтому соединение отсутствует.
Вы уверены, что это даже выход в 'while' блок? Попробуйте выполнить код с помощью 'pdb'. – Cyphase
Если ваш клиент и сервер находятся в одном файле, если вы не используете поточную/многопроцессорную обработку, это не сработает, потому что ваш скрипт python может делать только одну вещь за раз - когда он пытается подключиться, сценарий делая соединение, т. е. он не может принять, поэтому соединение отказывается. Чтобы исправить это, поместите код сервера в свой собственный поток. – barny
@Cyphase Да, он входит в блок while, я печатаю там. Он печатает только один раз, но затем он разрушается, что означает, что метод accept вызывает проблему, которая препятствует запуску программы. –