2017-01-24 58 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'那裏... –