【问题标题】:'WinError 10061' when using a sockets function in a tk command在 tk 命令中使用套接字函数时出现“WinError 10061”
【发布时间】:2016-04-24 23:12:23
【问题描述】:

您好,感谢您阅读本文。我知道什么问题出在哪里,但我不知道如何解决它。

所以问题是这样的(我认为),python 试图在用户输入主机名之前运行connect()hostname)因此 python 试图连接到一个空白主机('')反过来导致[WinError 10061] 发生。我尝试使用另一个函数(connect_buffer())缓冲connect(),即使我添加了一个if 语句,如果hostname 为空白(''),则将hostname 设置为'localhost' ),但这也不起作用并出现了同样的错误。

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

这是错误:

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

感谢所有提供帮助的人。

【问题讨论】:

  • @Pythonisa 我会试试谢谢
  • @Pythonista 谢谢它的工作,只需将其添加为答案,然后单击勾号
  • 编辑了为什么冻结的答案

标签: windows sockets python-3.x tkinter


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2017-06-11
  • 2022-01-06
相关资源
最近更新 更多