2015-08-17 3 views
0

Я пытаюсь отправить и получить данные с помощью 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 все еще не работает, поэтому соединение отсутствует.

+0

Вы уверены, что это даже выход в 'while' блок? Попробуйте выполнить код с помощью 'pdb'. – Cyphase

+1

Если ваш клиент и сервер находятся в одном файле, если вы не используете поточную/многопроцессорную обработку, это не сработает, потому что ваш скрипт python может делать только одну вещь за раз - когда он пытается подключиться, сценарий делая соединение, т. е. он не может принять, поэтому соединение отказывается. Чтобы исправить это, поместите код сервера в свой собственный поток. – barny

+0

@Cyphase Да, он входит в блок while, я печатаю там. Он печатает только один раз, но затем он разрушается, что означает, что метод accept вызывает проблему, которая препятствует запуску программы. –

ответ

1

Поскольку вы не представили полный пример исполняемого кода, я взял ваш фрагмент и удалил аспекты объявления класса, добавил определения для ip/port и т. Д. Также добавил тайм-аут сокета. Anywayt этот код работает для меня на Windows, 7х64 с 32-битным Python 2.7.8:

import threading 
import socket 

is_shutdown = False 
BUFFERSIZE_IN = 32768 

def my_tcp_server(): 

    # Establish a TCP Connection 
    sock_in = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock_in.bind((host_ip, host_port)) 
    sock_in.settimeout(10000) 
    sock_in.listen(1) 
    print "ready" 

    while not is_shutdown: 
     print "before accept" 
     conn, address = sock_in.accept() 
     print "after accept" 
     try: 
      recv_buffer = conn.recv(BUFFERSIZE_IN) 
      print "recv works!" 
      if recv_buffer != "": 
       msg = recv_buffer.decode('utf-8') 
       print "Received",msg 
     except socket.error as socket_error: 
      print "SocketError: %s", str(socket_error) 
     conn.close()  
    print "Shutting down server" 
    sock_in.close() 


def main(): 
    print "Starting.." 
    threading.Thread(target=my_tcp_server).start() 
def sendData(): 
    sock_out = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP Connection 
    sock_out.connect((remote_ip, remote_port)) 
    sock_out.send("ASD") 
    sock_out.close() 

host_ip="127.0.0.1" 
remote_ip = host_ip 
host_port = 8073 
remote_port = host_port 

main() 
print "Sending" 
sendData() 

print "Completed" 
is_shutdown = True 

Выход есть:

Starting.. 
Sending 
ready 
before accept 
Completedafter accept 

recv works! 
Received ASD 
Shutting down server 

Я предполагаю, что есть что-то в вашем классе/конструктор/что я могу Не вижу, что делает ваш код неработоспособным.

НТН Barny

+0

Спасибо. Да, это был порядок исполнения. Теперь это сработало и для меня. –

Смежные вопросы