listing28-2.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 ListableNode(Node):
  12. def list(self):
  13. return listdir(self.dirname)
  14. class Client(tk.Frame):
  15. def __init__(self, master, url, dirname, urlfile):
  16. super().__init__(master)
  17. self.node_setup(url, dirname, urlfile)
  18. self.pack()
  19. self.create_widgets()
  20. def node_setup(self, url, dirname, urlfile):
  21. self.secret = random_string(SECRET_LENGTH)
  22. n = ListableNode(url, dirname, self.secret)
  23. t = Thread(target=n._start)
  24. t.setDaemon(1)
  25. t.start()
  26. # Give the server a head start:
  27. sleep(HEAD_START)
  28. self.server = ServerProxy(url)
  29. for line in open(urlfile):
  30. line = line.strip()
  31. self.server.hello(line)
  32. def create_widgets(self):
  33. self.input = input = tk.Entry(self)
  34. input.pack(side='left')
  35. self.submit = submit = tk.Button(self)
  36. submit['text'] = "Fetch"
  37. submit['command'] = self.fetch_handler
  38. submit.pack()
  39. self.files = files = tk.Listbox()
  40. files.pack(side='bottom', expand=True, fill=tk.BOTH)
  41. self.update_list()
  42. def fetch_handler(self):
  43. query = self.input.get()
  44. try:
  45. self.server.fetch(query, self.secret)
  46. self.update_list()
  47. except Fault as f:
  48. if f.faultCode != UNHANDLED: raise
  49. print("Couldn't find the file", query)
  50. def update_list(self):
  51. self.files.delete(0, tk.END)
  52. self.files.insert(tk.END, self.server.list())
  53. def main():
  54. urlfile, directory, url = sys.argv[1:]
  55. root = tk.Tk()
  56. root.title("File Sharing Client")
  57. client = Client(root, url, directory, urlfile)
  58. client.mainloop()
  59. if __name__ == '__main__': main()