Python error: [Errno 111] Connection refused

Python error: [Errno 111] Connection refused

我正在尝试使用 Python 通过 TCP 连接发送和接收数据。我的服务器和客户端在同一个文件中,定义和使用如下。

在构造函数中,我将服务器定义为:

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 方法之后没有打印任何东西,这意味着它在那里崩溃了。

我怀疑问题出在同步上。也就是说,服务器启动速度不够快。

有什么想法吗?

编辑: 其中一个建议是 运行 服务器在一个单独的线程上,我尝试如下:

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功能还是不行,所以没有连接。

由于您没有提供完整的可执行代码示例,我采用了您的代码片段并删除了 class 声明方面,添加了 ip/port 等的定义。还添加了套接字超时。无论如何,此代码适用于 Windows 7x64 和 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

我猜你的 class/constructor/something 我看不出是什么让你的代码无法工作。

HTH 巴尼