From 390595c0e2367d2e36a3f354bc3d34ea6dd6c40c Mon Sep 17 00:00:00 2001 From: Xevion Date: Fri, 8 Jan 2021 15:06:52 -0600 Subject: [PATCH] small reorganization to old client/server, client fixed and sending messages to server --- client/gui.py | 33 +++++++++++++++++++++++++++------ client/main.py | 32 -------------------------------- helpers.py | 7 +++++++ oclient.py | 11 +++-------- oserver.py | 19 +++++++------------ 5 files changed, 44 insertions(+), 58 deletions(-) create mode 100644 helpers.py diff --git a/client/gui.py b/client/gui.py index 9891961..b3cf01f 100644 --- a/client/gui.py +++ b/client/gui.py @@ -1,15 +1,17 @@ import socket +from pprint import pprint -from PyQt5.QtCore import QThread, pyqtSignal +from PyQt5.QtCore import QThread, pyqtSignal, Qt, QEvent from PyQt5.QtWidgets import QMainWindow, QDialog, QDialogButtonBox, QVBoxLayout -from config import config from client.MainWindow import Ui_MainWindow +from config import config IP = '127.0.0.1' PORT = 55555 -HEADER_LENGTH = int(config.get(IP, 'HeaderLength')) +HEADER_LENGTH = 10 + class ReceiveWorker(QThread): messages = pyqtSignal(str) @@ -24,9 +26,12 @@ class ReceiveWorker(QThread): while True: try: length = int(self.client.recv(HEADER_LENGTH).decode('ascii')) - message = self.client.recv(length) + message = self.client.recv(length).decode('ascii') if message == 'NICK': - self.client.send(self.nickname.encode('ascii')) + header = f'{len(self.nickname):<{HEADER_LENGTH}}' + final = header + self.nickname + pprint(final) + self.client.send(final.encode('ascii')) else: self.messages.emit(message) except: @@ -67,10 +72,26 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.nickname = 'Default' + self.textEdit.installEventFilter(self) + self.receiveThread = ReceiveWorker(self.client, self.nickname) self.receiveThread.messages.connect(self.addMessage) self.receiveThread.start() + self.show() - def addMessage(self, message: str): + def eventFilter(self, obj, event): + if event.type() == QEvent.KeyPress and obj is self.textEdit: + if event.key() == Qt.Key_Return and self.textEdit.hasFocus(): + self.sendMessage(self.textEdit.toPlainText()) + self.textEdit.clear() + return super().eventFilter(obj, event) + + def addMessage(self, message: str) -> None: self.textBrowser.append(message) + + def sendMessage(self, message: str) -> None: + header = f'{len(message):<{HEADER_LENGTH}}' + final = header + message + pprint(final) + self.client.send(final.encode('ascii')) diff --git a/client/main.py b/client/main.py index 508e010..63e5928 100644 --- a/client/main.py +++ b/client/main.py @@ -1,40 +1,8 @@ from PyQt5.QtWidgets import QApplication from client.gui import MainWindow -import socket -import threading - -# nickname = input("Nickname: ") - app = QApplication([]) app.setApplicationName("TCPChat Client") m = MainWindow() -# client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -# client.connect(('127.0.0.1', 55555)) -# -# def receive(): -# while True: -# try: -# message = client.recv(1024).decode('ascii') -# if message == 'NICK': -# client.send(nickname.encode('ascii')) -# else: -# m.addMessage(message) -# # print(message) -# except: -# print("Error! Disconnecting.") -# client.close() -# break -# -# Sending Messages To Server -# def write(): -# while True: -# message = '{}: {}'.format(nickname, input('')) -# client.send(message.encode('ascii')) -# -# Starting Threads For Listening And Writing -# receive_thread = threading.Thread(target=receive) -# receive_thread.start() - app.exec_() diff --git a/helpers.py b/helpers.py new file mode 100644 index 0000000..5a49db8 --- /dev/null +++ b/helpers.py @@ -0,0 +1,7 @@ +HEADER_LENGTH = 10 + + +def prepare(message: str, encoding='ascii') -> bytes: + """Prepares a message for sending through a socket by adding a proper header and encoding it.""" + header = f'{len(message):<{HEADER_LENGTH}}' + return (header + message).encode(encoding) diff --git a/oclient.py b/oclient.py index 9268d4c..ce53cf3 100644 --- a/oclient.py +++ b/oclient.py @@ -1,6 +1,7 @@ import socket import threading +import helpers from config import config HEADER_LENGTH = int(config['DEFAULT']['HeaderLength']) @@ -11,19 +12,13 @@ client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client.connect(('127.0.0.1', 55555)) -def send_message(message): - header = f'{len(message):<{HEADER_LENGTH}}' - final = header + message - client.send(final.encode('ascii')) - - def receive(): while True: try: length = int(client.recv(HEADER_LENGTH).decode('ascii')) message = client.recv(length).decode('ascii') if message == 'NICK': - send_message(nickname) + client.send(helpers.prepare(nickname)) else: print(message) except: @@ -36,7 +31,7 @@ def receive(): def write(): while True: message = '{}: {}'.format(nickname, input('')) - send_message(message) + client.send(helpers.prepare(message)) # Starting Threads For Listening And Writing diff --git a/oserver.py b/oserver.py index fef2107..1ca0e4e 100644 --- a/oserver.py +++ b/oserver.py @@ -1,6 +1,7 @@ import socket import threading +import helpers from config import config # Connection Data @@ -20,16 +21,10 @@ nicknames = [] # Sending Messages To All Connected Clients def broadcast(message): - header = f'{len(message):<{HEADER_LENGTH}}' - final = header + message + print(f'Broadcasting: "{message}"') + encoded = helpers.prepare(message) for client in clients: - client.send(final.encode('ascii')) - - -def send_message(client, message): - header = f'{len(message):<{HEADER_LENGTH}}' - final = header + message - client.send(final.encode('ascii')) + client.send(encoded) # Handling Messages From Clients @@ -45,6 +40,7 @@ def handle(client): index = clients.index(client) clients.remove(client) client.close() + nickname = nicknames[index] broadcast('{} left!'.format(nickname)) nicknames.remove(nickname) @@ -59,7 +55,7 @@ def receive(): print("Connected with {}".format(str(address))) # Request And Store Nickname - send_message(client, 'NICK') + client.send(helpers.prepare('NICK')) length = int(client.recv(HEADER_LENGTH).decode('ascii')) nickname = client.recv(length).decode('ascii') nicknames.append(nickname) @@ -68,8 +64,7 @@ def receive(): # Print And Broadcast Nickname print("Nickname is {}".format(nickname)) broadcast("{} joined!".format(nickname)) - - send_message(client, 'Connected to server!') + client.send(helpers.prepare('Connected to server!')) # Start Handling Thread For Client thread = threading.Thread(target=handle, args=(client,))