2017-01-24 56 views
0

我试图制作一个多线程的Web代理。我可以做一个单线程的,但是当我尝试使用多线程时,它每次都会抛出这个错误。`member_descriptor`对象无法在套接字对象上调用

Traceback (most recent call last): 
    File "malwareProxy.py", line 25, in newClientInteraction 
    request = clientSocket.recv(BUFFLEN) 
TypeError: 'member_descriptor' object is not callable 

我有这些进口:

import sys 
import thread 
from socket import * 

而且重要的位码:

def newClientInteraction(clientSocket, addr): 
    try: 
     port = 80 

     request = clientSocket.recv(BUFFLEN) 
.... 
serverListener = socket(AF_INET, SOCK_STREAM) 
    serverListener.bind(("", serverPort)) 
    serverListener.listen(100) 
    print("\nProxy Server listening on port {0}...".format(serverPort)) 

    # Start to listen for connections 
    while True: 
     (newsocket, addr) = serverListener.accept() 
     print("Connection made from: {0}".format(newsocket.getpeername())) 

     thread.start_new_thread(newClientInteraction, (socket, addr)) 

请帮助。我对Python很新,不知道为什么我得到这个错误。我看了一些关于这个错误的其他帖子,答案似乎与使用多个文件和导入的程序员有关,我只使用一个文件。谢谢。

+1

当您启动线程,你似乎传递** **插座,而你创造了一个__( newsocket,addr)__对上面两行。尝试在__thread.start_new_thread__调用中传递** newsocket **。 – sal

+0

我真的很蠢!谢谢。 –

+1

不,你不是。这是一个不幸的拼写错误。我添加了一个答案:如果没有问题,请接受它。 :) – sal

回答

1

错误是由于在启动新线程时传递参数时出现不幸的错字。 不幸的,因为它匹配套接字库中的名称,因此生成的错误更难以调试。

的错误信息可以通过尝试调用被复制:

import socket 
socket.socket.recv(BUFFLEN) 

这是什么错字正在生产。值得庆幸的是,它很容易修复,修改这一行:

thread.start_new_thread(newClientInteraction, (socket, addr)) 

阅读,而不是

thread.start_new_thread(newClientInteraction, (newsocket, addr)) 
+0

你能解释一下'member_descriptor'是什么吗?我也有类似的问题,但与'cur_time = cur_time + timedelta.seconds(1)'< - 我不认为这与插座有什么关系... –

+0

更新:似乎我需要使用'cur_time = cur_time + timedelta(秒= 1)'。不过,我仍然困惑为什么有'member_descriptor'那里... –