Sep-15-2017, 09:20 AM
from tkinter import *
from tkinter.ttk import *
import socket
import _thread
class ChatClient(Frame):
def __init__(self, root):
Frame.__init__(self, root)
self.root = root
self.initUI()
self.serverSoc = None
self.serverStatus = 0
self.buffsize = 1024
self.allClients = {}
self.counter = 0
def initUI(self):
self.root.title("Simple P2P Chat Client")
ScreenSizeX = self.root.winfo_screenwidth()
ScreenSizeY = self.root.winfo_screenheight()
self.FrameSizeX = 800
self.FrameSizeY = 700
FramePosX = (ScreenSizeX - self.FrameSizeX)//2
#print(FramePosX)
FramePosY = (ScreenSizeY - self.FrameSizeY)//2
#print(FramePosY)
self.root.geometry("%sx%s+%s+%s" % (self.FrameSizeX,self.FrameSizeY,FramePosX,FramePosY))
self.root.resizable(width=False, height=False)
padX = 10
padY = 10
parentFrame = Frame(self.root)
parentFrame.grid(padx=padX, pady=padY, stick=E+W+N+S)
ipGroup = Frame(parentFrame)
serverLabel = Label(ipGroup, text="Set: ")
self.nameVar = StringVar()
self.nameVar.set("Rajeev")
nameField = Entry(ipGroup, width=10, textvariable=self.nameVar)
self.serverIPVar = StringVar()
self.serverIPVar.set("127.0.0.1")
serverIPField = Entry(ipGroup, width=15, textvariable=self.serverIPVar)
self.serverPortVar = StringVar()
self.serverPortVar.set("8090")
serverPortField = Entry(ipGroup, width=5, textvariable=self.serverPortVar)
serverSetButton = Button(ipGroup, text="Set", width=10, command=self.handleSetServer)
addClientLabel = Label(ipGroup, text="Add friend: ")
self.clientIPVar = StringVar()
self.clientIPVar.set("127.0.0.1")
clientIPField = Entry(ipGroup, width=15, textvariable=self.clientIPVar)
self.clientPortVar = StringVar()
self.clientPortVar.set("8091")
clientPortField = Entry(ipGroup, width=5, textvariable=self.clientPortVar)
clientSetButton = Button(ipGroup, text="Add", width=10, command=self.handleAddClient)
serverLabel.grid(row=0, column=0)
nameField.grid(row=0, column=1)
serverIPField.grid(row=0, column=2)
serverPortField.grid(row=0, column=3)
serverSetButton.grid(row=0, column=4, padx=5)
addClientLabel.grid(row=0, column=5)
clientIPField.grid(row=0, column=6)
clientPortField.grid(row=0, column=7)
clientSetButton.grid(row=0, column=8, padx=5)
readChatGroup = Frame(parentFrame)
self.receivedChats = Text(readChatGroup, bg="white", width=60, height=30, state=DISABLED)
self.friends = Listbox(readChatGroup, bg="white", width=30, height=30)
self.receivedChats.grid(row=0, column=0, sticky=W+N+S, padx = (0,10))
self.friends.grid(row=0, column=1, sticky=E+N+S)
writeChatGroup = Frame(parentFrame)
self.chatVar = StringVar()
self.chatField = Entry(writeChatGroup, width=80, textvariable=self.chatVar)
sendChatButton = Button(writeChatGroup, text="Send", width=10, command=self.handleSendChat)
self.chatField.grid(row=0, column=0, sticky=W)
sendChatButton.grid(row=0, column=1, padx=5)
self.statusLabel = Label(parentFrame)
bottomLabel = Label(parentFrame, text="Created by Rajeev sahani ([email protected])")
ipGroup.grid(row=0, column=0)
readChatGroup.grid(row=1, column=0)
writeChatGroup.grid(row=2, column=0, pady=10)
self.statusLabel.grid(row=3, column=0)
bottomLabel.grid(row=4, column=0, pady=10)
def handleSetServer(self):
if self.serverSoc != None:
self.serverSoc.close()
self.serverSoc = None
self.serverStatus = 0
serveraddr = (self.serverIPVar.get().replace(' ',''), int(self.serverPortVar.get().replace(' ','')))
try:
self.serverSoc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.serverSoc.bind(serveraddr)
self.serverSoc.listen(5)
self.setStatus("Server listening on %s:%s" % serveraddr)
#threading.start_new_thread(self.listenClients,())
_thread.start_new_thread(self.listenClients,())
self.serverStatus = 1
self.name = self.nameVar.get().replace(' ','')
if self.name == '':
self.name = "%s:%s" % serveraddr
except:
self.setStatus("Error setting up server")
def listenClients(self):
while 1:
clientsoc, clientaddr = self.serverSoc.accept()
self.setStatus("Client connected from %s:%s" % clientaddr)
self.addClient(clientsoc, clientaddr)
_thread.start_new_thread(self.handleClientMessages, (clientsoc, clientaddr))
self.serverSoc.close()
def handleAddClient(self):
if self.serverStatus == 0:
self.setStatus("Set server address first")
return
clientaddr = (self.clientIPVar.get().replace(' ',''), int(self.clientPortVar.get().replace(' ','')))
print(clientaddr)
try:
clientsoc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsoc.connect(clientaddr)
self.setStatus("Connected to client on %s:%s" % clientaddr)
self.addClient(clientsoc, clientaddr)
_thread.start_new_thread(self.handleClientMessages, (clientsoc, clientaddr))
except:
self.setStatus("Error connecting to client")
def handleClientMessages(self, clientsoc, clientaddr):
while 1:
try:
data = clientsoc.recv(self.buffsize)
if not data:
break
self.addChat("%s:%s" % clientaddr, data)
except:
break
self.removeClient(clientsoc, clientaddr)
clientsoc.close()
self.setStatus("Client disconnected from %s:%s" % clientaddr)
def handleSendChat(self):
if self.serverStatus == 0:
self.setStatus("Set server address first")
return
msg = self.chatVar.get().replace(' ','')
if msg == '':
return
self.addChat("me", msg)
for client in self.allClients.keys():
client.send(msg)
def addChat(self, client, msg):
self.receivedChats.config(state=NORMAL)
self.receivedChats.insert("end",client+": "+msg+"\n")
self.receivedChats.config(state=DISABLED)
def addClient(self, clientsoc, clientaddr):
self.allClients[clientsoc]=self.counter
self.counter += 1
self.friends.insert(self.counter,"%s:%s" % clientaddr)
def removeClient(self, clientsoc, clientaddr):
print (self.allClients)
self.friends.delete(self.allClients[clientsoc])
del self.allClients[clientsoc]
print (self.allClients)
def setStatus(self, msg):
self.statusLabel.config(text=msg)
print (msg)
def main():
root = Tk()
app = ChatClient(root)
root.mainloop()
if __name__ == '__main__':
main() Server listening on 127.0.0.1:8090('127.0.0.1', 8091)
Error connecting to client
