2013-09-30 52 views
-2

我想运行此代码时出现以下错误。我犯了一个错误,我不明白的地方一切正常在使用python编写的类不明白时出现错误

如果你认为错误

import socket,time 
import thread 

    class http(): 

     def __init__(self): 
      self.socket = socket 
      self.port = 5000 
      self.buffsize = 1024 
      self.listen = 5 
      self._header = ("HTTP/1.1 200 OK\r\n" 
          "Content-Type: text/html; charset=utf-8\r\n\r\n") 

     def _worker(self,socket,sleep): 
      # Client connect for thread worker 
      while True: 
       time.sleep(sleep) 
       client,address = socket.accept() 
       data = client.recv(1024) 
       if data: 
        client.send(self._header) 
        client.send(data) 
       client.close() 

     def httpHandler(self): 
      # Create Socket For Connection 
      try: 
       self.socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
       self.socket.bind(('127.0.0.1',self.port)) 
       self.socket.listen(self.listen) 
       self.socket.setblocking(False) 
      except socket.error as error: 
       print error 
      finally: 
       print "HTTP Server Running - 127.0.0.1:5000" 
       self._worker(self.socket,1) 

    if __name__ == "__main__": 
     application = http() 
     application.httpHandler() 

当我想在终端上运行,则错误

但怎么能说有一种自我

HTTP Server Running - 127.0.0.1:5000 
Traceback (most recent call last): 
    File "/Users/batuhangoksu/http.py", line 44, in <module> 
    application.httpHandler() 
    File "/Users/batuhangoksu/http.py", line 40, in httpHandler 
    self._worker(self.socket,1) 
    File "/Users/batuhangoksu/http.py", line 22, in _worker 
    client,address = socket.accept() 
AttributeError: 'module' object has no attribute 'accept' 
+1

使用不同的变量名本地变量'socket' – karthikr

+0

'self.socket = socket' ...这是荒谬的 – Matthias

+1

@Matthias请好的。 http://blog.stackoverflow.com/2012/07/kicking-off-the-summer-of-love/ – tacaswell

回答

2

问题使用self.socket,不socket

  client,address = self.socket.accept() 

socket是模块的名称。 self.socketsocket._socketobject,通过调用socket.socket返回的值。实际上,有太多名为“socket”的东西:)。 我建议将self.socket更改为其他内容以帮助区分这些想法。


当您拨打socket.socket时,还需要保存返回值。目前,你有

self.socket = socket 

其设置实例属性self.socket到模块socket。这没什么用处,因为您已经可以使用普通旧socket访问该模块。相反,使用类似

 self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

import multiprocessing as mp 
import socket 
import time 

HOST = ''   # Symbolic name meaning all available interfaces 
PORT = 50007  # Arbitrary non-privileged port 

def server(): 
    header = ("HTTP/1.1 200 OK\r\n" 
       "Content-Type: text/html; charset=utf-8\r\n\r\n") 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.bind((HOST, PORT)) 
    s.listen(5) 
    while True: 
     conn, addr = s.accept() 
     data = conn.recv(1024) 
     if not data: break 
     conn.send(header) 
     conn.send(data) 
     conn.close() 

def client(): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((HOST, PORT)) 
    s.send('Hello, world') 
    data = s.recv(1024) 
    s.close() 
    print 'Received', repr(data) 

sproc = mp.Process(target = server) 
sproc.daemon = True 
sproc.start() 
while True: 
    time.sleep(.5) 
    client()