Dear All
I hope everyone is doing well. Below is the code for a rudimentary chat app. The server side seems to be working fine but the client side is unable to send messages to the server size and instead just double prints the message. It's not complete and 'Will' contain a lot of bad coding but I'm learning a lot of new stuff day by day this way.
Any help will be highly appreciated.
Regards
iMu
I hope everyone is doing well. Below is the code for a rudimentary chat app. The server side seems to be working fine but the client side is unable to send messages to the server size and instead just double prints the message. It's not complete and 'Will' contain a lot of bad coding but I'm learning a lot of new stuff day by day this way.
from PyQt5 import QtWidgets import sys import socket import threading import ipaddress class MainWindow(QtWidgets.QWidget): def __init__(self): super(MainWindow, self).__init__() self.service = "" self.server = socket.socket() self.client = socket.socket() self.machineIP = socket.gethostbyname(socket.gethostname()) self.isconnected = "" self.connectedusers = [] self.chatwindow = QtWidgets.QListWidget() self.userwindow = QtWidgets.QListWidget() self.typingfield = QtWidgets.QLineEdit() self.sendbutton = QtWidgets.QPushButton("Send") self.sendbutton.clicked.connect(self.sendpressed) self.setupUI() self.show() def setupUI(self): mainlayout = QtWidgets.QVBoxLayout() displaybox = QtWidgets.QHBoxLayout() userlist = QtWidgets.QVBoxLayout() userlist.addWidget(QtWidgets.QLabel("Users Connected:")) userlist.addWidget(self.userwindow) displaybox.addWidget(self.chatwindow, 3) displaybox.addLayout(userlist, 1) inputbox = QtWidgets.QHBoxLayout() inputbox.addWidget(self.typingfield) inputbox.addWidget(self.sendbutton) mainlayout.addLayout(displaybox) mainlayout.addLayout(inputbox) self.setLayout(mainlayout) self.chatwindow.addItem("/host to setup server on local host (Port 7000)") self.chatwindow.addItem("/[email protected] to connect to server on local host (Port 7000)") self.typingfield.setFocus() self.setWindowTitle("TAG CHAT") def sendpressed(self): typedtext = self.typingfield.text() if typedtext: if typedtext[0] == "/": self.metaprocessor(typedtext) else: if self.service: message = self.machineIP + " : " + str(typedtext) self.chatwindow.addItem(message) if self.service == "server": self.broadcast(typedtext) elif self.service == "client": self.server.send(message.encode()) else: self.chatwindow.addItem("Not connected to any group.") self.typingfield.clear() self.typingfield.setFocus() def metaprocessor(self, typedtext): if typedtext == "/host": serverstart = threading.Thread(target=self.makeserver, args=()) serverstart.daemon = True serverstart.start() elif typedtext[0:9] == "/connect@" and len(typedtext) > 9: userip = typedtext[9:] try: ipaddress.ip_address(userip) clientstart = threading.Thread(target=self.startclient, args=(userip, 7000)) clientstart.daemon = True clientstart.start() except ValueError: self.chatwindow.addItem("Invalid IP address provided '" + userip + "'") else: self.chatwindow.addItem("Invalid syntax") def startclient(self, serverip, port): self.server.connect((str(serverip), port)) self.service = "client" while True: message = self.server.recv(1024) self.chatwindow.addItem(message.decode()) def makeserver(self): self.chatwindow.addItem("Creating server @ " + self.machineIP + ":7000") self.server.bind((self.machineIP, 7000)) self.chatwindow.addItem("Server started successfully...\nListening to all connections") self.service = "server" self.server.listen(100) while True: conn, addr = self.server.accept() message = "Connected to " + self.machineIP + ":7000" conn.send(message.encode()) self.connectedusers.append((conn, addr)) newconnection = threading.Thread(target=self.startconnection, args=(conn, addr)) newconnection.daemon = True newconnection.start() def startconnection(self, conn, addr): self.chatwindow.addItem("User " + str(addr) + " has joined the group.") while True: data = conn.recv(1024) message = addr[0] + " : " + data.decode() self.broadcast(message) def broadcast(self, typedtext): for each in self.connectedusers: message = each[1][0] + " : " + str(typedtext) each[0].send(message.encode()) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) mainApplication = MainWindow() sys.exit(app.exec_())You'll need to run two instances of the script i guess. To hoset use '/host' to connect to a host use '/connect@[ip address of host]'. Port is set to default 7000.
Any help will be highly appreciated.
Regards
iMu