Сокет не виден при использовании Python на сервере Ubuntu - PullRequest
0 голосов
/ 06 июня 2011

Я пишу приложение, которое должно прослушивать клиента, и когда оно подключается, оно должно получить некоторые данные.Он отлично работает, когда я запускаю его локально на своем компьютере или на сервере, но когда я пытаюсь запустить его на сервере и подключиться с моего компьютера, он вообще не работает.Время соединения истекло.

Я попытался запустить программу, а затем проверить 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()

1 Ответ

3 голосов
/ 06 июня 2011

Вместо server.bind((self.HOST, self.PORT)) попробуйте:

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

Для адресов IPv4 пустая строка представляет INADDR_ANY;при получении сокета, связанного с этим адресом, ваш процесс будет получать пакеты от всех интерфейсов (не только обратной связи или основного интерфейса Ethernet).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...