2014-10-27 30 views
-1

你好,stackoverflow的用戶,所以我有這個問題,我試圖編寫一個web服務器,但腳本結束之前,我甚至可以測試它是否工作。所以我的問題是我怎樣才能使腳本,以便它將永遠持續運行?爲什麼我的python腳本不能繼續收聽

#import threading 
#import socket 
#import signal # Signal support (server shutdown on signal receive) 
import multiprocessing 
#import queue 

def MasterProcessA(): 
    import socket 
    import multiprocessing 
    import threading 
    HOST = '97.107.139.231' # Symbolic name, meaning all available interfaces 
    PORT = 8080 # Arbitrary non-privileged port 
    #print(PORT) 
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    #print 'Socket created' 

    #Bind socket to local host and port 
    #try: 
    socket.bind((HOST, PORT)) 
    #except socket.error as msg: 
    ##print 'Bind failed. Error Code : ' + str(msg[0]) + ' Message ' + msg[1] 
    #print 'Socket bind complete' 

    #Start listening on socket 
    socket.listen(100) 
    print "starting server" 
    def ConnProcessA(): 
     print "thread step one" 
     Conn, Address = socket.accept() 
     t = threading.Thread(target=ConnectionProcessorA) 
     print "thread step two" 
     #t.daemon = True 
     t.start() 
     #print("A Got connection from:", Address) 
     DataRecived = Conn.recv(1024) #receive data from client 
     DataRecived = bytes.decode(DataRecived) #decode it to string 
     print DataRecived 
     Conn.send("HELLO World") 
     Conn.clouse() 

    ConnProcessA = threading.Thread(target=ConnProcessA) 
    #t.daemon = True 
    ConnProcessA.start() 

MasterProcessA = multiprocessing.Process(target=MasterProcessA) 
MasterProcessA.start() 
+0

到底在哪裏結束? – Duniyadnd 2014-10-27 00:40:14

+1

使用while循環? :) – Dyrborg 2014-10-27 00:42:59

+0

這是整個腳本,我不知道在哪裏實現while循環 – door 2014-10-27 01:11:39

回答

1

您的代碼有幾個問題。

  • 該線程不運行。您需要修改: ConnProcessA.start() ConnProcessA.join()
  • ConnectionProcessorA未包含在您粘貼的代碼中。所以我必須將這兩行註釋掉: t = threading.Thread(target=ConnectionProcessorA) t.start()
  • 名稱遮蔽。請參閱以下行: socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ConnProcessA = threading.Thread(target=ConnProcessA) MasterProcessA = multiprocessing.Process(target=MasterProcessA)
  • 您使用現有模塊/函數名稱命名實例。名字遮蔽是非常危險的。試着執行兩行中的任意一行,你會看到錯誤。
  • 另一方面,如果直截了當,重用一個變量來保存不同的東西是可以的。例如,下面兩行足夠接近以避免混淆: DataRecived = Conn.recv(1024) #receive data from client DataRecived = bytes.decode(DataRecived) #decode it to string
  • 似乎你的套接字服務器是不斷地收聽同一端口,那麼你可能需要添加s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。正如在the doc的最底部所說的那樣。
  • 不太嚴重的一點,在Python編碼約定中,CapWords通常用於類名稱ref。您將它用於函數名稱和變量名稱。更好地保持你的代碼一致。
相關問題