-
-
Save mousetail/e8668807de7f51000c69740c8423b947 to your computer and use it in GitHub Desktop.
Server Side
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
mport struct | |
import socket | |
from threading import Thread | |
from rich import print | |
print('\n'*100) | |
# server's IP address | |
SERVER_HOST = "0.0.0.0" | |
SERVER_PORT = 5002 # port we want to use | |
separator_token = "<SEP>" # we will use this to separate the client name & message | |
# initialize list/set of all connected client's sockets | |
client_sockets = set() | |
# create a TCP socket | |
s = socket.socket() | |
# make the port as reusable port | |
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |
# bind the socket to the address we specified | |
s.bind((SERVER_HOST, SERVER_PORT)) | |
# listen for upcoming connections | |
s.listen(5) | |
print(f"[*] Listening as {SERVER_HOST}:{SERVER_PORT}") | |
def listen(msg): | |
msg = msg.replace(separator_token, ":") | |
for client_socket in client_sockets: | |
# and send the message | |
# print(msg) | |
x=msg.encode('utf-8') | |
client_socket.send(struct.pack('!L', len(x))+x)#send(msg.encode()) | |
def listen_for_messages(socket=s, callback=print): | |
buff=b"" | |
size=0 | |
while True: | |
buff+=(socket.recv(1024)) | |
if size == 0: | |
size,=struct.unpack("!L", buff[:4]) | |
buff=buff[4:] | |
if len(buff)>=size: | |
callback(buff[:size].decode('utf-8')) | |
buff=buff[size:] | |
size=0 | |
def listen_for_client(cs): | |
#try: | |
listen_for_messages(cs, listen) | |
#except: | |
# print("Client disconnected") | |
# client_sockets.remove(cs) | |
while True: | |
# we keep listening for new connections all the time | |
client_socket, client_address = s.accept() | |
print(f"[+] {client_address} connected.") | |
# add the new connected client to connected sockets | |
client_sockets.add(client_socket) | |
# start a new thread that listens for each client's messages | |
t = Thread(target=listen_for_client, args=(client_socket,)) | |
# make the thread daemon so it ends whenever the main thread ends | |
t.daemon = True | |
# start the thread | |
t.start() | |
# close client sockets | |
for cs in client_sockets: | |
cs.close() | |
# close server socket | |
s.close() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment