在Ubuntu服务器上使用Python时套接字不可见

在Ubuntu服务器上使用Python时套接字不可见,python,sockets,ubuntu,Python,Sockets,Ubuntu,我正在编写一个应用程序,该应用程序应该侦听客户机,当它连接时,它应该捕获一些数据。当我在自己的计算机或服务器上本地运行它时,它工作得很好,但是当我尝试在服务器上运行它,并从我的计算机连接时,它根本不工作。连接超时 我试着运行这个程序,然后检查netstat(在服务器上),只有当我的主机设置为localhost时,它才会显示任何内容。如果我将主机设置为服务器的IP地址(或主机名,或socket.getfqdn()),则netstat中不会显示任何内容 代码如下: class Listen(thre

我正在编写一个应用程序,该应用程序应该侦听客户机,当它连接时,它应该捕获一些数据。当我在自己的计算机或服务器上本地运行它时,它工作得很好,但是当我尝试在服务器上运行它,并从我的计算机连接时,它根本不工作。连接超时

我试着运行这个程序,然后检查netstat(在服务器上),只有当我的主机设置为localhost时,它才会显示任何内容。如果我将主机设置为服务器的IP地址(或主机名,或
socket.getfqdn()
),则netstat中不会显示任何内容

代码如下:

class Listen(threading.Thread):
    def __init__(self):
        self.PORT = 2079
        self.HOST = socket.getfqdn()
        threading.Thread.__init__(self)
        self.finished = threading.Event()

    def stop(self):
        self.finished.set()
        self.join()

    def run(self):
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.bind((self.HOST, self.PORT))
        server.listen(5)
        while not self.finished.isSet():
            try:
                server.settimeout(1)
                channel, details = server.accept()
                server.settimeout(None)
                Client(channel, details).start()
            except socket.timeout:
                pass

class Client(threading.Thread):
    def __init__(self, channel, details):
        self.channel = channel
        self.details = details
        self.log = []
        threading.Thread.__init__(self)

    def run(self):
        print 'Received connection:', self.details [ 0 ]
        entries = int(self.channel.recv(3))
        print "Receiving", entries, "new entries"

        for i in range(entries):
            self.log.append([])
            self.log[i].append(float(self.channel.recv(10)))
            self.log[i].append(float(self.channel.recv(10)))
            self.log[i].append(self.channel.recv(14))


        self.channel.close()
        print 'Closed connection:', self.details [ 0 ]

        print "The obtained log: "
        print self.log

def main():
    listen = Listen()
    listen.start()
    while True:
        input = raw_input(">>").lower()
        if input in ["start"]:
            if listen.isAlive():
                print "Already started"
            else:
                listen = Listen()
                listen.start()
        if input in ["stop"]:
            if not listen.isAlive():
                print "Already stopped"
            else:
                listen.stop()
        if input in ["exit"]:
            if listen.isAlive():
                listen.stop()
            sys.exit()
        if input in ["status"]:
            print "The server is " + ["not ", ""][listen.isAlive()] + "running"


if __name__ == '__main__':
    main()

请尝试以下操作,而不是
server.bind((self.HOST,self.PORT))

server.bind(('', self.PORT))

对于IPv4地址,空字符串表示INADDR_ANY;当接收绑定到此地址的套接字时,您的进程将从所有接口(不仅仅是环回接口或主以太网接口)接收数据包。

请尝试以下操作,而不是
server.bind((self.HOST,self.PORT))

server.bind(('', self.PORT))

对于IPv4地址,空字符串表示INADDR_ANY;当接收绑定到此地址的套接字时,您的进程将从所有接口(不仅仅是环回接口或主以太网接口)接收数据包。

Eric,您具体的问题是什么?请在执行脚本之前和之后添加
netstat-n--listening
ifconfig a
的输出,并将输出放在例如pastebin?好的,因此我已将self.HOST设置为“”。以下是我的netstat和ifconfig之前和之后:当我在服务器上运行客户端脚本并将其连接到132.206.31.58时,它工作正常,但当我从其他计算机运行客户端脚本时,我得到:error:[Errno 10060]连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接的主机无法响应而导致建立的连接失败老实说,这表明您的脚本完全正常,您运行客户端脚本的“其他计算机”或“其他计算机”与服务器之间的路由存在问题。而且,我从来没有问过这个问题,但是为什么你不使用SocketServer呢?我试着联系管理员,但他没有回应。希望第二封电子邮件能起到作用。至于SocketServer。我从来没有听说过。不过我可以试试,谢谢!Eric,你具体的问题是什么?请在执行脚本之前和之后添加
netstat-n--listing
ifconfig a
的输出,并将输出放在例如pastebin上?好的,因此我已将self.HOST设置为“”。以下是我的netstat和ifconfig之前和之后:当我在服务器上运行客户端脚本并将其连接到132.206.31.58时,它工作正常,但当我从其他计算机运行客户端脚本时,我得到:error:[Errno 10060]连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接的主机无法响应而导致建立的连接失败老实说,这表明您的脚本完全正常,您运行客户端脚本的“其他计算机”或“其他计算机”与服务器之间的路由存在问题。而且,我从来没有问过这个问题,但是为什么你不使用SocketServer呢?我试着联系管理员,但他没有回应。希望第二封电子邮件能起到作用。至于SocketServer。我从来没有听说过。不过我可以试试,谢谢!这个答案是正确的。但是,您也可以使用“0.0.0.0”作为主机名,我认为这与INADDR_ANY相同。@渐近线:虽然这是正确的,但在Python中表示INADDR_ANY的标准方法是使用空字符串。我使用“”作为主机,它没有改变任何内容。这个答案是正确的。但是,您也可以使用“0.0.0.0”作为主机名,我认为这与INADDR_ANY相同。@渐近线:虽然这是正确的,但在Python中表示INADDR_ANY的标准方法是使用空字符串。我使用“”作为主机,它没有改变任何内容。