mirror of
https://github.com/Xevion/tcp-chat.git
synced 2026-01-31 06:26:11 -06:00
modified versions of text based server/client that handle extremely large messages
This commit is contained in:
+47
@@ -0,0 +1,47 @@
|
|||||||
|
import socket
|
||||||
|
import threading
|
||||||
|
|
||||||
|
from config import config
|
||||||
|
|
||||||
|
HEADER_LENGTH = int(config['DEFAULT']['HeaderLength'])
|
||||||
|
|
||||||
|
nickname = input("Nickname: ")
|
||||||
|
|
||||||
|
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)
|
||||||
|
else:
|
||||||
|
print(message)
|
||||||
|
except:
|
||||||
|
print("Error! Disconnecting.")
|
||||||
|
client.close()
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
# Sending Messages To Server
|
||||||
|
def write():
|
||||||
|
while True:
|
||||||
|
message = '{}: {}'.format(nickname, input(''))
|
||||||
|
send_message(message)
|
||||||
|
|
||||||
|
|
||||||
|
# Starting Threads For Listening And Writing
|
||||||
|
receive_thread = threading.Thread(target=receive)
|
||||||
|
receive_thread.start()
|
||||||
|
|
||||||
|
write_thread = threading.Thread(target=write)
|
||||||
|
write_thread.start()
|
||||||
+79
@@ -0,0 +1,79 @@
|
|||||||
|
import socket
|
||||||
|
import threading
|
||||||
|
|
||||||
|
from config import config
|
||||||
|
|
||||||
|
# Connection Data
|
||||||
|
host = '127.0.0.1'
|
||||||
|
port = 55555
|
||||||
|
HEADER_LENGTH = int(config['DEFAULT']['HeaderLength'])
|
||||||
|
|
||||||
|
# Starting Server
|
||||||
|
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
server.bind((host, port))
|
||||||
|
server.listen()
|
||||||
|
|
||||||
|
# Lists For Clients and Their Nicknames
|
||||||
|
clients = []
|
||||||
|
nicknames = []
|
||||||
|
|
||||||
|
|
||||||
|
# Sending Messages To All Connected Clients
|
||||||
|
def broadcast(message):
|
||||||
|
header = f'{len(message):<{HEADER_LENGTH}}'
|
||||||
|
final = header + 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'))
|
||||||
|
|
||||||
|
|
||||||
|
# Handling Messages From Clients
|
||||||
|
def handle(client):
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
# Broadcasting Messages
|
||||||
|
length = int(client.recv(HEADER_LENGTH).decode('ascii'))
|
||||||
|
message = client.recv(length).decode('ascii')
|
||||||
|
broadcast(message)
|
||||||
|
except:
|
||||||
|
# Removing And Closing Clients
|
||||||
|
index = clients.index(client)
|
||||||
|
clients.remove(client)
|
||||||
|
client.close()
|
||||||
|
nickname = nicknames[index]
|
||||||
|
broadcast('{} left!'.format(nickname))
|
||||||
|
nicknames.remove(nickname)
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
|
# Receiving / Listening Function
|
||||||
|
def receive():
|
||||||
|
while True:
|
||||||
|
# Accept Connection
|
||||||
|
client, address = server.accept()
|
||||||
|
print("Connected with {}".format(str(address)))
|
||||||
|
|
||||||
|
# Request And Store Nickname
|
||||||
|
send_message(client, 'NICK')
|
||||||
|
length = int(client.recv(HEADER_LENGTH).decode('ascii'))
|
||||||
|
nickname = client.recv(length).decode('ascii')
|
||||||
|
nicknames.append(nickname)
|
||||||
|
clients.append(client)
|
||||||
|
|
||||||
|
# Print And Broadcast Nickname
|
||||||
|
print("Nickname is {}".format(nickname))
|
||||||
|
broadcast("{} joined!".format(nickname))
|
||||||
|
|
||||||
|
send_message(client, 'Connected to server!')
|
||||||
|
|
||||||
|
# Start Handling Thread For Client
|
||||||
|
thread = threading.Thread(target=handle, args=(client,))
|
||||||
|
thread.start()
|
||||||
|
|
||||||
|
|
||||||
|
receive()
|
||||||
Reference in New Issue
Block a user