2014-10-27 58 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。您将它用于函数名称和变量名称。更好地保持你的代码一致。
相关问题