1

我想实现令牌传递的环算法。该算法稍后将使用群集中的不同节点进行测试。我是python和网络编程的新手。我想要简单地开始,并在环中有两个节点。当令牌值等于节点号时,节点会将令牌发送给另一令牌,否则节点等待令牌。 因此,在我的代码中,节点1启动,节点2等待令牌,它应该循环。我的代码只能运行2轮!我知道连接有问题(打开和关闭它)。我每次都关闭连接,但如果您知道如何操作,它可以保持打开状态。 那么我怎样才能改变它,让它像我想要的那样循环,而不仅仅是两回合!我运行节点1代码,然后运行节点2 ,但最终应该只有一个代码在任何节点上运行!任何帮助和建议,将不胜感激。令牌在Python中传递环算法

#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() 

回答

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 
0

您无法连接两次:

ss.connect((host, other_port)) 

头需要为每个连接的新插座。 所以你必须把

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: ... 

然后它适用于我。

+1

谢谢,但你如何同步他们在同一时间开始?我把连接在循环,所以我不会得到连接拒绝错误。 – mohi

+0

我刚开始使用它,然后打印并开始工作。 – User