2016-10-29 12 views
-1

これは私が取り組んでいるソケットに基づくp2pのコードです。 これを実行しようとするたびに、グローバル名は定義されていません。Pythonはグローバル名が定義されていないと言っています

import socket 
import os.path 
import sys 
import urlparse 
import threading 

class Node: 

     def startlisten(sock): 
       sock.listen(6) 
       while True: 
        c,addr = sock.accept() 
        print "Client connected all set to go : "+str(addr) 
        thread1 = threading(target=retrfile,args=(c,)) 
        thread1.start() 

     def __init__(self): 
       self.port=raw_input("Enter the port: ") 
       self.shareddir=raw_input("Enter the name of the folder you want to share: ") 
       self.sysname=raw_input("Enter your desired nick name: ") 
       self.known=set() 
       self.s=socket.socket() 
       host = socket.gethostname() 
       port = int(self.port) 
       print host,port 

       self.s.bind((host,port)) 
       t=threading.Thread(target=startlisten,args =(self.s,)) 
       t.start() 



     def retrfile(sock): 
      code,filename = sock.recv(1024) 
      if code == 0: 
       if os.pathisfile(os.path.join("D:\\Sankalp0203\\",filename)): 
        sock.send("OK",str(os.path.getsize(filename))) 
        userResponse = sock.recv(1024) 
        if userResponse == 'Y': 
         with open(filename,'rb') as f: 
          bytestoread = f.read(1024) 
          sock.send(1024) 
          while bytestoread != "": 
           bytestoread = f.read(1024) 
           sock.send(byestoread) 




     def _hello(self,other): 
       self.known.add(other) 

     def _broadcast(self,query,history): 
       for other in self.known.copy(): 
         if other in history: 
           continue 
         try: 
           name = urlparse(other)[1] 
           parts=name.split(":") 
           port = int(parts[-1]) 
           host = "http://"+parts[0] 
           self.s.connect((host,port)) 
           self.s.send(0,query) 
           code , size = s.recv(1024) 
           if code == "OK": 
            inp = raw_input("File Exists and filesize : "+str(size)+" download? y/n: ") 
            if inp == Y: 
             self.s.send(Y) 
             write(self.s,size) 
            return code , size, 
         except: 
           self.known.remove(other) 
       return FAIL,EMPTY 

     def write(sock1,size): 
      f = open('new'+filename,'wb') 
      data = sock1.recv(1024) 
      totalrecv = len(data) 
      f.write(data) 
      while(totalrecv < size): 
       data = sock1.recv(1024) 
       f.write(data) 
       totalrecv+=len(data) 




def Main(): 
     n=Node() 

     num=3 
     while(num): 
       input = (int)(raw_input("Enter 1 for fetch and 2 to sit idle and 3 to introduce to new peer")) 
       if(input == 1): 
         filename = raw_input("Enter the name of the file") 
         n.query(filename) 
       if(input == 3): 
         frnd =raw_input("Enter the url of the friend socket") 
         n._hello(frnd) 
if __name__=='__main__': 
     Main() 

私はこれを実行すると、私はグローバル名が定義されていないと言って、次のエラーを取得plsはグローバルな名前startlistenが定義されていないためstartlistenが定義されていないことを言っている

Traceback (most recent call last): 
    File "D:/Sankalp0203/P2Per.py", line 101, in <module> 
    Main() 
    File "D:/Sankalp0203/P2Per.py", line 89, in Main 
    n=Node() 
    File "D:/Sankalp0203/P2Per.py", line 28, in __init__ 
    t=threading.Thread(target=startlisten,args =(self.s,)) 
NameError: global name 'startlisten' is not defined 
+0

いいえ、グローバル名 'startlisten'はありません。この名前を持つ 'Node' *には*メソッドしかないので、' self.startlisten'が機能するかもしれません。しかし、そのメソッドに 'self'パラメータを最初に与える必要があります。 –

+0

メソッドの半分に 'self'引数がありません。これはより多くの問題につながります。 –

答えて

0

助けます。 startlistenというグローバル関数はありません。作成したメソッドはNodeクラスの下にあります。あなたは自己を逃した。

t=threading.Thread(target=self.startlisten,args =(self.s,)) 
関連する問題