2016-04-24 28 views
0

嗨,感谢您阅读本文。我知道什么问题是,但我无法弄清楚如何解决它。当在tk命令中使用套接字函数时'WinError 10061'

所以,问题是这样的(我认为),蟒蛇正试图运行connect()用户输入主机名(hostname)之前,因此蟒蛇试图连接到一个空白的主机(''),这又导致[WinError 10061]即将发生。我试图用另一个函数(connect_buffer())缓冲connect(),即使当我添加一个if语句,将hostname设置为'localhost',如果hostname为空(''),但错误仍然不存在,并且出现错误错误。

所以我的问题是我该如何解决这个问题?

以下是错误:

Traceback (most recent call last): 
    File "H:\server\New folder\Tk_cleint.py", line 89, in <module> 
    setup_confirm_button = tk.Button(window,text = 'Connect', command = setup()) 
    File "H:\server\New folder\Tk_cleint.py", line 18, in setup 
    create_sock(host, int(port)) 
    File "H:\server\New folder\Tk_cleint.py", line 36, in create_sock 
    connect(cleintsocket, nhost, nport) 
    File "H:\server\New folder\Tk_cleint.py", line 27, in connect 
    self.connect((hostname, connectingport)) 
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it 

这里是我的代码

#---Import statments---# 
import socket, os, multiprocessing 
import tkinter as tk 

#---global variables---# 
setup = '' 
cleintsocket = '' 

#---Defs---# 
def setup(): 
    global host, port, user 
    host = setup_host_box.get() 
    port = setup_port_box.get() 
    user = setup_user_box.get() 

def connect_buffer(self, hostname, connectingport): 
    connect(self, hostname, connectingport) 

def connect(self, hostname, connectingport): 
    if hostname == '': 
     hostname = 'localhost' 
    self.connect((hostname, int(connectingport))) 
    print('connected') 
    multiprocessing.Process(target = resv()).start() 

def create_sock(nhost, nport): 
    global cleintsocket 
    cleintsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    connect(cleintsocket, nhost, nport) 

def send(username, cleintsock): 
    '''to send a message''' 
    usrmsg = (username + ' - ' + chat_msg_box.get()).encode() 
    cleintsock.send(usrmsg) 

def resv(sock): 
    '''resive subscript, run through mutiprosses module''' 
    while True: 
     rmsg = sock.recv(1024).decode() 
     chat_msg_display_text.insert('end.0.', rmsg) 

def chat(): 
    '''loads chat page''' 
    setup_host_text.pack_forget() 
    setup_host_box.pack_forget() 
    setup_port_text.pack_forget() 
    setup_port_box.pack_forget() 
    setup_user_text.pack_forget() 
    setup_user_box.pack_forget() 
    setup_confirm_button.pack_forget() 
    chat_msg_display_text.pack() 
    chat_msg_box.pack() 
    chat_msg_send_button.pack() 

def start(): 
    '''starts the setup page''' 
    setup_host_text.pack() 
    setup_host_box.pack() 
    setup_port_text.pack() 
    setup_port_box.pack() 
    setup_user_text.pack() 
    setup_user_box.pack() 
    setup_confirm_button.pack() 

def send_button_callback(): 
    '''add a buffer to allow time for 'cleintsocket' to be defined in "create_sock()"''' 
    send(user, cleintsocket) 

#---TK Setup---# 
#--window setup--# 
window = tk.Tk() 
window.title('Chat') 
window.geometry('600x600') 
window.configure(background='#ffffff') 
#--connection setup page--# 
setup_host_text = tk.Label(window, text = 'Host') 
setup_host_box = tk.Entry(window, bg = '#ffffff') 
setup_port_text = tk.Label(window, text = 'Port') 
setup_port_box = tk.Entry(window, bg = '#ffffff') 
setup_user_text = tk.Label(window, text = 'Username') 
setup_user_box = tk.Entry(window, bg = '#ffffff') 
setup_confirm_button = tk.Button(window,text = 'Connect', command = setup()) 
#--chat page--# 
chat_msg_box = tk.Entry(window, bg='#ffffff') 
chat_msg_send_button = tk.Button(window, text = 'send', command = send_button_callback) 
chat_msg_display_text = tk.Text(window, width=600, height=500, wrap = 'word') 
#--------------# 

start() 

这里有一些链接的问题没有帮助:

WinError 10049: The requested address is not valid in its context

Connecting to myself through my public IP through TCP

Webscraping with Python: WinError 10061: Target machine actively refused

谢谢任何​​人的帮助。

+0

@Pythonisa我会试试看,谢谢 –

+0

@Pythonista感谢它的工作只是添加它作为答案,并不适合点击刻度 –

+0

为什么它冻结编辑答案 – Pythonista

回答

1

在您setup_confirm_button你使用command = setup()这应该是command = setupcommand = lambda: setup()

通过调用setup()你实际上调用该函数,而不是将其设置为以该命令的函数的引用,并且它的运行您的功能,而不是点击按钮。

使用lambda: setup()的原因也适用,因为lambda创建了一个匿名函数。

此外,在你的多处理过程中,你同样调用resv()而不是通过resv这是用while循环调用函数并阻塞主事件循环。

+0

谢谢你一直这么好的帮助! –

相关问题