small reorganization to old client/server, client fixed and sending messages to server

This commit is contained in:
Xevion
2021-01-08 15:06:52 -06:00
parent 4dc14d118b
commit 390595c0e2
5 changed files with 44 additions and 58 deletions

View File

@@ -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'))

View File

@@ -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_()

7
helpers.py Normal file
View File

@@ -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)

View File

@@ -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

View File

@@ -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,))