【问题标题】:Tkinter createfilehandler with socket not working带有套接字的 Tkinter createfilehandler 不起作用
【发布时间】:2016-07-18 06:07:11
【问题描述】:

我在第 18 章的“Python 和 Tkinter 编程”(John Grayson 的)client_server.py 中找到了一个使用套接字的 Tkinter createfilehandler 的工作示例

我已经在 Linux Mint 14.04 和 python 2.7.6 上对其进行了测试,该程序似乎可以正常运行,但是...

问题是:服务器发送日期和时间,但客户端不显示。我不懂为什么。你能帮我理解这个问题吗?

代码如下:

from Tkinter import *
import sys, socket, time

class Server:
    def __init__(self):
        host = 'localhost' #socket.gethostbyname(socket.gethostname())
        addr = host, 18000
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.bind(addr)
        while 1:
            time.sleep(5)
            print time.asctime(time.localtime(time.time()))
            s.sendto(time.asctime(time.localtime(time.time())), addr)

class GUIClient:
    def __init__(self, master=None):
        self.master = master
        self.master.title('Time Service Client')
        self.frame = Frame(master, relief=RAISED, borderwidth=2)
        self.text = Text(self.frame, height=26, width=50)
        self.scroll = Scrollbar(self.frame, command=self.text.yview)
        self.text.configure(yscrollcommand=self.scroll.set)
        self.text.pack(side=LEFT)
        self.scroll.pack(side=RIGHT, fill=Y)
        self.frame.pack(padx=4, pady=4)
        Button(master, text='Close', command=self.master.quit).pack(side=TOP)

        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        self.socket.bind(('localhost', 18000))

        self.master.createfilehandler(self.socket, READABLE, self.ihandler)

        self.master.after(5000, self.doMark)

    def ihandler(self, sock, mask):
        data, addr = sock.recvfrom(256)
        self.text.insert(END, '%s\n' % data)

    def doMark(self):
        self.text.insert(END, 'waiting...\n')
        self.master.after(5000, self.doMark)

if len(sys.argv) < 2:
    print 'select -s (server) or -c (client)'
    sys.exit(2)
if sys.argv[1] == '-s':
    server=Server()
elif sys.argv[1] == '-c':
    root = Tk()
    root.option_readfile('optionDB')
    example = GUIClient(root)
    root.mainloop() 

我已修改代码以正常工作。

【问题讨论】:

  • 您将服务器和客户端套接字绑定到同一个端口,这可能效果不佳。
  • 感谢您的评论,但我尝试使用其他端口和相同的结果。
  • 稍后我注意到host 变量可能不是127.0.0.1,所以服务器试图发送到错误的地址。

标签: python sockets tkinter


【解决方案1】:

Server.__init__ 中的主机变量很可能与GUIClient 使用的 IP 地址 127.0.0.1 不同

class Server:
    def __init__(self):
        host = socket.gethostbyname(socket.gethostname())
        ...
        # addr probably != 127.0.0.1
        s.sendto(time.asctime(time.localtime(time.time())), addr)

class GUIClient:
    def __init__(self, master=None):
         ...
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        # change port if necessary
        self.socket.bind(('127.0.0.1', 18000))

【讨论】:

  • host = 127.0.1.1,但我强制使用相同的地址,例如 127.0.0.1。没有成功。我用 Linux Mint 在 VirtualBox 上运行程序。
  • 我强制 IP 为 'localhost' 并且程序工作正常。你说得对,哈卡拉先生。好工作。谢谢。
猜你喜欢
  • 2022-01-11
  • 2013-12-22
  • 2021-06-29
  • 2020-11-29
  • 2016-07-01
  • 2012-05-07
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多