Python Forum
Issues in Chat App for Local Network
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Issues in Chat App for Local Network
#1
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.

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
Reply


Messages In This Thread
Issues in Chat App for Local Network - by iMuny - Jul-17-2019, 01:11 PM
RE: Issues in Chat App for Local Network - by iMuny - Aug-19-2019, 10:25 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Chat box locking up with multiple clients running Clunk_Head 1 1,990 Nov-27-2019, 04:13 PM
Last Post: Clunk_Head
  How to restart another PC on the local network? Kundan 1 2,153 Sep-21-2019, 11:31 AM
Last Post: ThomasL
  Chat (Client-Server) andresdrr 3 3,779 Aug-26-2019, 02:01 PM
Last Post: ThomasL

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020