Python сокеты не получают сообщение - PullRequest
1 голос
/ 20 февраля 2012

Я пытаюсь смоделировать Token Ring, используя Python с сокетами, но столкнулся с проблемой

основная программа

node1 = node.node(8081,8082,token)
node2 = node.node(8082,8083,emptyFrame)
node3 = node.node(8083,8084,emptyFrame)
node4 = node.node(8084,8081,emptyFrame)

node1.firstrun()
node1.start()
node2.start()
node3.start()
node4.start()

узел

class node(threading.Thread):
    def __init__(self,s,d,frame):
        threading.Thread.__init__(self)
        self.dest = d
        self.current = frame
        self.newframe = frame
        self.source = s

    def firstrun(self):
        time.sleep(1)
        host = "localhost"
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.bind(("", self.source))
        sendmessage = str(self.newframe.fullFrame())
        s.sendto(sendmessage, (host,self.dest))
        print "sent"

    def run(self):
        host = "localhost"
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.bind(("", self.source))
        while True:         
            print "running"
            message, addr = s.recvfrom(4096)
            self.newframe = message
            print "received"

В коде я создаю 4 узла, предоставляющих им разные порты и один из них - сообщение. Я заставляю этот первый порт отправлять сообщение следующему узлу, и все они запускают основную функцию. В основной функции я жду сообщения и делаю цикл while. Ход печатается для всех 4 узлов, а полученный - нет. Таким образом, я не понимаю, почему узел никогда не получает первый токен. Моя программа просто ждет бесконечно. (Я удалил лишний код для ясности, ни один из них не должен был препятствовать процессу основного сокета)

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

сначала вы должны отправить все потоки, иначе сокет не будет прослушиваться. time.sleep () - плохой стиль кодирования, вы не можете полагаться на временные функции, когда дело доходит до многопоточности.

отправлять ваши темы в одну точку.

threads = [node1, node2, node3, node4]
[thread.start() for thread in threads]

и извлеките метод firstrun() из класса вашего узла и либо внедрите его в class initnode (он не должен быть дочерним элементом потоков. после вы отправили свои потоки сокета.

0 голосов
/ 20 февраля 2012

Вы можете изменить последовательность на:

node1.start()
node2.start()
node3.start()
node4.start()
node1.firstrun()
node2.firstrun()
node3.firstrun()
node4.firstrun()

Тогда вы увидите, что «получил» будет напечатано.

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