listing28-1.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from xmlrpc.client import ServerProxy, Fault
  2. from server import Node, UNHANDLED
  3. from client import random_string
  4. from threading import Thread
  5. from time import sleep
  6. from os import listdir
  7. import sys
  8. import tkinter as tk
  9. HEAD_START = 0.1 # Seconds
  10. SECRET_LENGTH = 100
  11. class Client(tk.Frame):
  12. def __init__(self, master, url, dirname, urlfile):
  13. super().__init__(master)
  14. self.node_setup(url, dirname, urlfile)
  15. self.pack()
  16. self.create_widgets()
  17. def node_setup(self, url, dirname, urlfile):
  18. self.secret = random_string(SECRET_LENGTH)
  19. n = Node(url, dirname, self.secret)
  20. t = Thread(target=n._start)
  21. t.setDaemon(1)
  22. t.start()
  23. # Give the server a head start:
  24. sleep(HEAD_START)
  25. self.server = ServerProxy(url)
  26. for line in open(urlfile):
  27. line = line.strip()
  28. self.server.hello(line)
  29. def create_widgets(self):
  30. self.input = input = tk.Entry(self)
  31. input.pack(side='left')
  32. self.submit = submit = tk.Button(self)
  33. submit['text'] = "Fetch"
  34. submit['command'] = self.fetch_handler
  35. submit.pack()
  36. def fetch_handler(self):
  37. query = self.input.get()
  38. try:
  39. self.server.fetch(query, self.secret)
  40. except Fault as f:
  41. if f.faultCode != UNHANDLED: raise
  42. print("Couldn't find the file", query)
  43. def main():
  44. urlfile, directory, url = sys.argv[1:]
  45. root = tk.Tk()
  46. root.title("File Sharing Client")
  47. client = Client(root, url, directory, urlfile)
  48. client.mainloop()
  49. if __name__ == "__main__": main()