Advertisement
Guest User

Client

a guest
Feb 21st, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 12.80 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # Foundations of Python Network Programming - Chapter 18 - xmlrpc_introspect.py
  3. # XML-RPC client
  4. import xmlrpclib
  5. from Tkinter import *
  6. import time
  7. import socket
  8. import thread
  9. import struct
  10. import json
  11. from ttk import *
  12.  
  13. myclients = {}
  14. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  15. sl = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  16. s.bind(('0.0.0.0', 0))
  17. sl.bind(('0.0.0.0', 0))
  18.  
  19. proxy = xmlrpclib.ServerProxy('http://127.0.0.1:7001')
  20.  
  21.  
  22.  
  23. class ChatClient(Frame):
  24.  
  25.     def __init__(self, root):
  26.         Frame.__init__(self, root)
  27.         self.root = root
  28.         self.registerUI()
  29.         self.status = 0
  30.         self.buffsize = 1024
  31.         self.allClients = {}
  32.  
  33.  
  34.  
  35.     def registerUI(self):
  36.  
  37.         self.root.title("Register")
  38.         registerSizeX = self.root.winfo_screenwidth()
  39.         registerSizeY = self.root.winfo_screenheight()
  40.         self.FrameSizeX = 285
  41.         self.FrameSizeY = 215
  42.         FramePosX = (registerSizeX - self.FrameSizeX) / 2
  43.         FramePosY = (registerSizeY - self.FrameSizeY) / 2
  44.         self.root.geometry("%sx%s+%s+%s" % (self.FrameSizeX, self.FrameSizeY, FramePosX, FramePosY))
  45.         self.root.resizable(width=False, height=True)
  46.  
  47.         #name field
  48.         nameLabel = Label(self.root, text="Name:")
  49.         self.nameVar = StringVar()
  50.         self.nameVar.set("Enter name")
  51.         nameEntry = Entry(self.root, width=20, textvariable=self.nameVar)
  52.         nameEntry.bind("<Button-1>", self.removeValue)
  53.  
  54.         #username field
  55.         usernameLabel = Label(self.root, text="Username:")
  56.         self.usernameVar = StringVar()
  57.         self.usernameVar.set("Enter username")
  58.         self.usernameEntry = Entry(self.root, width=20, textvariable=self.usernameVar)
  59.         self.usernameEntry.bind("<Button-1>", self.removeValue1)
  60.  
  61.         #password Field
  62.         passwordLabel = Label(self.root, text="Password:")
  63.         self.passwordEntry = Entry(self.root, width=20, show="*")
  64.         repasswordLabel = Label(self.root, text="Re-type password")
  65.         self.repasswordEntry = Entry(self.root, width=20, show="*")
  66.  
  67.         #email Field
  68.         emailLabel = Label(self.root, text="E-mail:")
  69.         emailEntry = Entry(self.root, width=20)
  70.  
  71.         #Register Button
  72.         registerButton = Button(self.root, text="Register") #enter command for register click
  73.  
  74.         #Already Logged in
  75.         loginLabel = Label(self.root, text="Already signed in?")
  76.         clickHereLabel = Label(self.root, text="Click here", font=(16)) #bind for command
  77.         clickHereLabel.bind("<Button-1>", self.openLogin)
  78.  
  79.         nameLabel.grid(row=0, column=0, sticky=E)
  80.         nameEntry.grid(row=0, column=1)
  81.         usernameLabel.grid(row=1, column=0, sticky=E)
  82.         self.usernameEntry.grid(row=1, column=1)
  83.         passwordLabel.grid(row=2, column=0, sticky=E)
  84.         self.passwordEntry.grid(row=2, column=1)
  85.         repasswordLabel.grid(row=3, column=0, sticky=E)
  86.         self.repasswordEntry.grid(row=3, column=1)
  87.         emailLabel.grid(row=4, column=0, sticky=E)
  88.         emailEntry.grid(row=4, column=1)
  89.         registerButton.grid(row=5, columnspan=2, pady=10)
  90.         loginLabel.grid(row=6, columnspan=2)
  91.         clickHereLabel.grid(row=7, columnspan=2)
  92.  
  93.         registerButton.bind("<Button-1>", self.checkValidity)
  94.  
  95.     def initUI(self):
  96.         self.chatUI = Toplevel(self.loginWindow)
  97.         self.chatUI.title("Simple P2P Chat Client")
  98.         ScreenSizeX = self.chatUI.winfo_screenwidth()
  99.         ScreenSizeY = self.chatUI.winfo_screenheight()
  100.         self.FrameSizeX = 800
  101.         self.FrameSizeY = 600
  102.         FramePosX = (ScreenSizeX - self.FrameSizeX) / 2
  103.         FramePosY = (ScreenSizeY - self.FrameSizeY) / 2
  104.         self.chatUI.geometry("%sx%s+%s+%s" % (self.FrameSizeX, self.FrameSizeY, FramePosX, FramePosY))
  105.         self.chatUI.resizable(width=False, height=False)
  106.  
  107.         padX = 10
  108.         padY = 10
  109.         parentFrame = Frame(self.chatUI)
  110.         parentFrame.grid(padx=padX, pady=padY, stick=E+W+N+S)
  111.  
  112.         ipGroup = Frame(parentFrame)
  113.         ipGroup.pack()
  114.         myAddress = Label(ipGroup, text="Info: ")
  115.  
  116.         self.nameVar = StringVar()
  117.         self.nameVar.set(self.loginUsernameEntry.get())
  118.         nameField = Entry(ipGroup, width=10, textvariable=self.nameVar)
  119.  
  120.         self.myIPvar = StringVar()
  121.         self.myIPvar.set(sl.getsockname()[0])
  122.         IPvarField = Entry(ipGroup, width=15, textvariable=self.myIPvar)
  123.         IPvarField.configure(state='readonly')
  124.  
  125.         self.myPortVar = StringVar()
  126.         self.myPortVar.set(sl.getsockname()[1])
  127.         portField = Entry(ipGroup, width=5, textvariable=self.myPortVar)
  128.         portField.configure(state='readonly')
  129.  
  130.         self.status = StringVar()
  131.         self.status.set("Online")
  132.         status = Entry(ipGroup, textvariable=self.status, width=10)
  133.         status.configure(state='readonly')
  134.  
  135.         addClientLabel = Label(ipGroup, text="Add Friend: ")
  136.         self.nameClient = StringVar()
  137.         clientNameField = Entry(ipGroup, width=10, textvariable=self.nameClient)
  138.  
  139.         logout = Button(ipGroup, text="Log out", width=10, command=self.logOut)
  140.  
  141.         clientSetButton = Button(ipGroup, text="Add", width=10, command=self.handleAddClient) #dodadi commandHandler
  142.         myAddress.grid(row=0, column=0)
  143.         nameField.grid(row=0, column=1)
  144.         IPvarField.grid(row=0, column=2)
  145.         portField.grid(row=0, column=3)
  146.         status.grid(row=0, column=4)
  147.         addClientLabel.grid(row=0, column=5)
  148.         clientNameField.grid(row=0, column=6)
  149.         clientSetButton.grid(row=0, column=7)
  150.         logout.grid(row=0, column=9)
  151.  
  152.         readChatGroup = Frame(parentFrame)
  153.         readChatGroup.pack()
  154.         self.receivedChats = Text(readChatGroup, bg="white", width=60, height=30, state=DISABLED)
  155.         self.friends = Listbox(readChatGroup, bg="white", width=30, height=30, selectmode=EXTENDED)
  156.         self.receivedChats.grid(row=0, column=0, sticky=W + N + S, padx=(0, 10))
  157.         self.friends.grid(row=0, column=1, sticky=E + N + S)
  158.  
  159.         writeChatGroup = Frame(parentFrame)
  160.         writeChatGroup.pack()
  161.  
  162.         self.chatVar = StringVar()
  163.         self.chatField = Entry(writeChatGroup, width=80, textvariable=self.chatVar)
  164.         sendChatButton = Button(writeChatGroup, text="Send", width=10, command=self.handleSendChat) #commanda za send
  165.         self.chatField.grid(row=0, column=0, sticky=W)
  166.         sendChatButton.grid(row=0, column=1, padx=5)
  167.         # self.handleReading()
  168.  
  169.         self.friends.bind("<<ListboxSelect>>", self.write)
  170.  
  171.  
  172.     def write(self, event):
  173.         self.var = self.friends.get(self.friends.curselection())
  174.         self.friends.get(ACTIVE)
  175.         if self.chatField.get() == "":
  176.             self.chatField.insert(0, str(self.var)+"(private): ")
  177.             print self.chatField.get()
  178.         else:
  179.             self.chatField.delete(0, "")
  180.             self.chatField.insert(0, str(self.var)+"(private): ")
  181.             print self.chatField.get()
  182.         print "I want to send to " + self.var
  183.  
  184.     def read(self, conn):
  185.         print "na start vlaga"
  186.         while True:
  187.             print "Ceka Konekcija"
  188.             s1, add = conn.accept()
  189.             self.receivedChats.configure(state=NORMAL)
  190.             print add
  191.             data = s1.recv(self.buffsize)
  192.             korisnici = json.loads(proxy.sendAddresses())
  193.             # for users in korisnici:
  194.             #     if tuple(korisnici[users]) == add:
  195.             pom = data.split(" ")
  196.             temp = pom[0]
  197.             del pom[0]
  198.             data = " ".join(pom)
  199.  
  200.             self.receivedChats.insert(END, temp + ": " + data + "\n")
  201.             self.receivedChats.configure(state=DISABLED)
  202.  
  203.     def handleSendChat(self):
  204.         self.receivedChats.configure(state=NORMAL)
  205.         text = self.chatField.get()
  206.         text = text.split(' ')
  207.         adresa = json.loads(proxy.sendAddresses())
  208.         ime = text[0].split('(')
  209.         if ime[0] in adresa:
  210.             s.connect(tuple(adresa[ime[0]]))
  211.             print "This is the address to send to: "+str(tuple(adresa[ime[0]]))
  212.         del text[0]
  213.         print text
  214.         poraka = " ".join(text)
  215.         s.send(self.loginUsernameEntry.get()+" "+poraka)
  216.         self.receivedChats.insert(END, "You: "+poraka+"\n")
  217.         self.receivedChats.configure(state=DISABLED)
  218.         print poraka
  219.         s.close()
  220.  
  221.     def logOut(self):
  222.         proxy.removeFromLogged(self.loginUsernameEntry.get())
  223.         self.chatUI.destroy()
  224.     #
  225.     # def handleReceiveChat(self):
  226.     #     sl.listen(1)
  227.     #     thread.start_new_thread(self.read, (sl,))
  228.  
  229.     def handleAddClient(self):
  230.  
  231.         registrirani_korisnici = json.loads(proxy.sendRegisteredClients())
  232.         adresinakorisnici = json.loads(proxy.sendAddresses())
  233.         if self.nameClient.get() in myclients.keys():
  234.             print "Already a friend"
  235.         else:
  236.             if self.nameClient.get() in registrirani_korisnici:
  237.                 myclients[self.nameClient.get()] = adresinakorisnici[self.nameClient.get()]
  238.                 # thread.start_new_thread(self.statusi,())
  239.                 self.friends.insert(END, self.nameClient.get())
  240.             else:
  241.                 print "he doesn't exist"
  242.  
  243.  
  244.     def openLogin(self, event):
  245.         self.loginUI()
  246.         self.root.geometry("%sx%s+%s+%s" % (0, 0, 0, 0))
  247.  
  248.     def loginUI(self):
  249.  
  250.         self.loginWindow = Toplevel(self.root)
  251.         self.loginWindow.title("Log in")
  252.         self.loginWindow.geometry("300x290+20+20")
  253.         self.loginWindow.resizable(width=False, height=True)
  254.  
  255.         upperFrame = Frame(self.loginWindow)
  256.         upperFrame.grid(row=0, column=0, padx=20, pady=30)
  257.         bottomFrame = Frame(self.loginWindow)
  258.         bottomFrame.grid(row=1, column=0)
  259.  
  260.         #username field
  261.         usernameLabel = Label(upperFrame, text="Username:")
  262.         self.loginUsernameEntry = Entry(upperFrame, width=22)
  263.  
  264.         #password field
  265.         passwordLabel = Label(upperFrame, text="Password:")
  266.         self.loginPasswordEntry = Entry(upperFrame, width=22, show='*')
  267.  
  268.         usernameLabel.grid(row=0, column=0, sticky=E)
  269.         self.loginUsernameEntry.grid(row=0, column=1)
  270.         passwordLabel.grid(row=1, column=0, sticky=E)
  271.         self.loginPasswordEntry.grid(row=1, column=1)
  272.  
  273.         #login Button
  274.  
  275.         loginButton = Button(bottomFrame, text="Log in", command=self.loginValidity) #command da otvara nov prozorec za chat posle logoinot
  276.         loginButton.grid(row=0, columnspan=2)
  277.  
  278.     def loginValidity(self):
  279.  
  280.         registriraniClienti = json.loads(proxy.sendRegisteredClients())
  281.         print registriraniClienti.keys()
  282.         print str(self.loginUsernameEntry.get())+" | "+str(self.loginPasswordEntry.get())+" | "+str(registriraniClienti[self.loginUsernameEntry.get()])
  283.         if self.loginUsernameEntry.get() in registriraniClienti.keys():
  284.             if self.loginPasswordEntry.get() == str(registriraniClienti[self.loginUsernameEntry.get()][0]):
  285.                 proxy.logIn(str(self.loginUsernameEntry.get()), str(self.loginPasswordEntry.get()), json.dumps(sl.getsockname()))
  286.                 sl.listen(1)
  287.                 thread.start_new_thread(self.read, (sl,))
  288.                 self.initUI()
  289.             else:
  290.                 noMatch = Label(self.loginWindow, text="The password or username didn\'t match")
  291.                 noMatch.grid(row=2, columnspan=2)
  292.         else:
  293.             noMatch1 = Label(self.loginWindow, text="The password or username didn\'t match")
  294.             noMatch1.grid(row=2, columnspan=2)
  295.  
  296.     def checkValidity(self, event):
  297.  
  298.         brojac = 0
  299.         if self.passwordEntry.get() == self.repasswordEntry.get():
  300.             brojac = brojac + 1
  301.         else:
  302.             notMatch = Label(self.root, text="The passwords don\'t match")
  303.             notMatch.grid(row=8, columnspan=2, pady=15)
  304.  
  305.         registeredClients = json.loads(proxy.sendRegisteredClients())
  306.         if self.usernameEntry.get() not in registeredClients:
  307.             brojac = brojac + 1
  308.         else:
  309.             notMatch1 = Label(self.root, text="The username already exists")
  310.             notMatch1.grid(row=9, columnspan=2)
  311.  
  312.         if brojac == 2:
  313.             proxy.Register(self.usernameEntry.get(), self.repasswordEntry.get(), json.dumps(sl.getsockname()))
  314.             successfulRegister = Label(self.root, text="You have been successfully registered")
  315.             successfulRegister.grid(row=8, columnspan=2)
  316.             time.sleep(2)
  317.             self.root.geometry("%sx%s+%s+%s" % (0, 0, 0, 0))
  318.             self.loginUI()
  319.  
  320.     def removeValue(self, event):
  321.         self.nameVar.set("")
  322.         return None
  323.  
  324.     def removeValue1(self, event):
  325.         self.usernameVar.set("")
  326.         return None
  327.  
  328. def Main():
  329.     root = Tk()
  330.     app = ChatClient(root)
  331.     root.mainloop()
  332.  
  333. if __name__ == '__main__':
  334.     Main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement