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