-2

このコードを実行しようとすると、次のエラーが発生します。私は間違いを犯しました私はすべての正常な場所を理解していません

どこにエラーがあると思いますか

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'
4

1 に答える 1

2

self.socketではなくを使用socket:

            client,address = self.socket.accept()

socketモジュールの名前です。の呼び出しによって返される値self.socketです。確かに、「ソケット」という名前のものが多すぎます:)。アイデアを分離するのに役立つ別のものに変更することをお勧めします。socket._socketobjectsocket.socketself.socket


を呼び出すときに、戻り値も保存する必要がありますsocket.socket。現在、あなたは

self.socket = socket

インスタンス属性self.socketをモジュールに設定しますsocket。プレーンな old で既にモジュールにアクセスできるため、これは役に立ちません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()
于 2013-09-30T19:17:58.777 に答える