令牌在python中传递环算法

时间:2014-01-17 16:41:23

标签: python algorithm network-programming distributed-computing

我正在尝试为令牌传递实现环算法。稍后将使用群集中的不同节点来测试该算法。我是python和网络编程的新手。我想从简单开始,并在环中有两个节点。只要令牌值等于节点号,节点就会将令牌发送到另一个令牌,如果不是,则节点等待令牌。 所以这里我的代码节点1启动,节点2等待令牌,它应该循环。我的代码仅适用于2轮!我知道连接存在问题(打开和关闭它)。我每次关闭连接,但如果你知道怎么做,它可以保持打开状态。 那么我怎样才能以一种尽可能多的方式来改变它,而不仅仅是两轮! 这就是我运行它的方式:我运行节点1代码,然后运行节点2 但最终,应该只有一个代码在任何节点上运行!任何帮助和建议都将不胜感激。

#node 1
import socket       
import time        

s = socket.socket()
ss = socket.socket()         
host = socket.gethostname() 
other_port = 12345 
my_port= 5454
token = 1   
time.sleep( 5 )     #to wait to other node to run the program
while True:
    print "node 1 is here"
    if token != 1:                                     
        while True:
            s.bind((host, my_port)) 
            s.listen(5)
            c, addr = s.accept()     
            print 'Node 1 Got connection from', addr
            data = c.recv(1024)
            if int(data) == 1:
                print "ifffffffffff node 1"
                token = 1
                c.close()
                break    
    else:
        ss.connect((host, other_port))
        token = token+1
        ss.sendall('2')
        print "Node 1 sent the",token
        ss.close()

#node 2
import socket
import time                

s = socket.socket()
ss = socket.socket()        
host = socket.gethostname() 
my_port = 12345                
other_port = 5454
token = 1 
while True:
    if token != 2:                                       
        while True:
            s.bind((host, my_port)) 
            s.listen(5)
            c, addr = s.accept()     
            print 'node 2 Got connection from', addr
            data = c.recv(1024)
            if int(data) == 2:
                token = 2
                c.close()
                break    
    else:
        ss.connect((host, other_port))
        token = token-1
        ss.sendall('1')
        print "Node 2 sent the",token
        ss.close()

2 个答案:

答案 0 :(得分:1)

我使用UDP而不是TCP来解决我的问题。这是我在python中做到的方式: 关于如何组织环中的节点以及何时传递令牌以及如何更改令牌号以及何时应终止所有进程,存在一些要求。我刚刚添加了代码来显示我使用的UDP的逻辑。

address = socket.gethostname()                                                            
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)                                     
has_token = False                                                                        
token = 1                                                                                
if id == 1:                                                                              
        has_token = True
        token = random.randrange(1,11,1)
        time.sleep( 5 )                                                                  
s.bind((address, port))
while token < max_token:                                                                 
        while not has_token:                                                             
                data_token, addr = s.recvfrom(8192)
                if data_token:
                        has_token = True                                                 
                        token = int(data_token)                                       
        if (token % 7) != id:                                                            
                token = increment_token(token)                                            
                s.sendto(str(token),(next_address,next_port))
                has_token = False                                                
        else:                                                                            
                token = set_random_token(token)
                s.sendto(str(token),(next_address,next_port))
                has_token = False

答案 1 :(得分:0)

您无法连接两次:

ss.connect((host, other_port))

Tou需要为每个连接添加一个新套接字。 所以你必须把

ss = socket.socket()  # before
ss.connect((host, other_port))

你也不能绑定两次。

host = socket.gethostname() 
my_port = 12345                
other_port = 5454

s = socket.socket()
s.bind((host, my_port)) 
s.listen(5)
token = 1 
while True: ...

然后它适合我。