Arbeit fand ich ein funktionierendes Beispiel für Tkinter createfilehandler mit Sockel in Kapitel 18 von "Python und Tkinter-Programmierung" (von John Grayson) client_server.pyTkinter createfilehandler mit Sockel nicht
ich es auf Linux Mint 14.04 getestet haben, mit Python 2.7.6, und das Programm scheint ohne Fehler zu funktionieren, aber ...
Das Problem ist, dass: Server sendet Datum und Uhrzeit, aber Client zeigt dies nicht an. Ich verstehe nicht warum. Kannst du mir helfen, das Problem zu verstehen? Hier
ist der Code:
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()
I-Code geändert haben, ohne Probleme zu arbeiten.
Sie verbindlich sind sowohl Server als auch Client-Sockets auf den gleichen Port, die wahrscheinlich nicht so gut funktioniert. –
Vielen Dank für den Kommentar, aber ich versuche es mit anderen Ports und das gleiche Ergebnis. – popad
Ich bemerkte ein wenig später, dass 'Host'-Variable wahrscheinlich etwas anderes als' 127.0.0.1' ist, so dass der Server versucht, eine falsche Adresse zu senden. –