2016-07-15 9 views
-1

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.

+0

Sie verbindlich sind sowohl Server als auch Client-Sockets auf den gleichen Port, die wahrscheinlich nicht so gut funktioniert. –

+0

Vielen Dank für den Kommentar, aber ich versuche es mit anderen Ports und das gleiche Ergebnis. – popad

+0

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. –

Antwort

0

Die Host-Variable in Server.__init__ ist sehr wahrscheinlich, anders als IP-Adresse 127.0.0.1 verwendet von GUIClient

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)) 
+0

host = 127.0.1.1, aber ich erzwinge die gleiche Adresse, zum Beispiel 127.0.0.1. Kein Erfolg. Ich starte Programm auf VirtualBox mit Linux Mint. – popad

+0

Ich erzwinge IP zu "localhost" und Programm funktioniert gut. Sie haben Recht Herr Hakala. Gut gemacht. Vielen Dank. – popad