Advertisement
Guest User

Untitled

a guest
May 26th, 2018
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.85 KB | None | 0 0
  1. """Script for Tkinter GUI chat client."""
  2. from socket import AF_INET, socket, SOCK_STREAM
  3. from threading import Thread
  4. import tkinter
  5.  
  6. def receive():
  7. """Handles receiving of messages."""
  8. while True:
  9. try:
  10. msg = client_socket.recv(BUFSIZ).decode("utf8")
  11. msg_list.insert(tkinter.END, msg)
  12. except OSError: # Possibly client has left the chat.
  13. break
  14.  
  15.  
  16. def send(event=None): # event is passed by binders.
  17. """Handles sending of messages."""
  18. msg = my_msg.get()
  19. my_msg.set("") # Clears input field.
  20. client_socket.send(bytes(msg, "utf8"))
  21. if msg == "{quit}":
  22. client_socket.close()
  23. top.quit()
  24.  
  25.  
  26.  
  27. def on_closing(event=None):
  28. """This function is to be called when the window is closed."""
  29. my_msg.set("{quit}")
  30. send()
  31.  
  32.  
  33. top = tkinter.Tk()
  34. top.title("CS201")
  35.  
  36. messages_frame = tkinter.Frame(top)
  37. my_msg = tkinter.StringVar() # For the messages to be sent.
  38. my_msg.set("Name")
  39. scrollbar = tkinter.Scrollbar(messages_frame) # To navigate through past messages.
  40.  
  41. msg_list = tkinter.Listbox(messages_frame, height=15, width=50, yscrollcommand=scrollbar.set)
  42. scrollbar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
  43. msg_list.pack(side=tkinter.LEFT, fill=tkinter.BOTH)
  44. msg_list.pack()
  45. messages_frame.pack()
  46.  
  47. entry_field = tkinter.Entry(top, textvariable=my_msg)
  48. entry_field.bind("<Return>", send)
  49. entry_field.pack()
  50. send_button = tkinter.Button(top, text="Send", command=send)
  51. send_button.pack()
  52. top.protocol("WM_DELETE_WINDOW", on_closing)
  53.  
  54. HOST = input('Enter host: ')
  55. PORT = input('Enter port: ')
  56. if not PORT:
  57. PORT = 33000 # Default value.
  58. else:
  59. PORT = int(PORT)
  60. BUFSIZ = 1024
  61. ADDR = (HOST, PORT)
  62. client_socket = socket(AF_INET, SOCK_STREAM)
  63. client_socket.connect(ADDR)
  64.  
  65. receive_thread = Thread(target=receive)
  66. receive_thread.start()
  67. tkinter.mainloop() # Starts GUI execution.
  68.  
  69.  
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80. =============================== SERVER
  81.  
  82. #!/usr/local/bin/python3.6
  83.  
  84. """Server for multithreaded (asynchronous) chat application."""
  85. from socket import AF_INET, socket, SOCK_STREAM
  86. from threading import Thread
  87.  
  88.  
  89. def accept_incoming_connections():
  90. """Sets up handling for incoming clients."""
  91. while True:
  92. client, client_address = SERVER.accept()
  93. print("%s:%s has connected." % client_address)
  94. client.send(bytes("Greetings from the cave! Now type your name and press enter!", "utf8"))
  95. addresses[client] = client_address
  96. Thread(target=handle_client, args=(client,)).start()
  97.  
  98.  
  99. def handle_client(client): # Takes client socket as argument.
  100. """Handles a single client connection."""
  101.  
  102. name = client.recv(BUFSIZ).decode("utf8")
  103. welcome = 'Welcome %s! If you ever want to quit, type {quit} to exit.' % name
  104. client.send(bytes(welcome, "utf8"))
  105. msg = "%s has joined the chat!" % name
  106. broadcast(bytes(msg, "utf8"))
  107. clients[client] = name
  108.  
  109. while True:
  110. msg = client.recv(BUFSIZ)
  111. if msg != bytes("{quit}", "utf8"):
  112. broadcast(msg, name+": ")
  113. else:
  114. client.send(bytes("{quit}", "utf8"))
  115. client.close()
  116. del clients[client]
  117. broadcast(bytes("%s has left the chat." % name, "utf8"))
  118. break
  119.  
  120.  
  121. def broadcast(msg, prefix=""): # prefix is for name identification.
  122. """Broadcasts a message to all the clients."""
  123.  
  124. for sock in clients:
  125. sock.send(bytes(prefix, "utf8")+msg)
  126.  
  127.  
  128. clients = {}
  129. addresses = {}
  130.  
  131. HOST = ''
  132. PORT = 33000
  133. BUFSIZ = 1024
  134. ADDR = (HOST, PORT)
  135.  
  136. SERVER = socket(AF_INET, SOCK_STREAM)
  137. SERVER.bind(ADDR)
  138.  
  139. if __name__ == "__main__":
  140. SERVER.listen(5)
  141. print("Waiting for connection...")
  142. ACCEPT_THREAD = Thread(target=accept_incoming_connections)
  143. ACCEPT_THREAD.start()
  144. ACCEPT_THREAD.join()
  145. SERVER.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement