【发布时间】: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,所以服务器试图发送到错误的地址。