Add 2 client/server files for time server test
Run the server, and clients. Server send time at connection and each 10 seconds while client stay connected.
This commit is contained in:
parent
cec199ffaa
commit
eb017b2790
|
@ -0,0 +1,61 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
timeclient.py
|
||||
|
||||
Time & networking test, talking script
|
||||
"""
|
||||
import socket, signal, select, sys
|
||||
|
||||
MSG_ARG_ERROR = "Usage: client.py hostname port"
|
||||
|
||||
if len(sys.argv) < 3:
|
||||
print(MSG_ARG_ERROR)
|
||||
sys.exit(1)
|
||||
|
||||
HOST = sys.argv[1]
|
||||
PORT = int(sys.argv[2])
|
||||
|
||||
BUFFER = 1024
|
||||
|
||||
MSG_SERVER_CONNECTED = "Serveur connecté @{}:{}"
|
||||
MSG_CLOSE_CONNECTION = "Connexion vers [{}:{}] fermée"
|
||||
|
||||
def prompt():
|
||||
sys.stdout.write('~')
|
||||
sys.stdout.flush()
|
||||
|
||||
def handler(signum, frame):
|
||||
""" Catch <ctrl+c> signal for clean stop"""
|
||||
print()
|
||||
print(MSG_CLOSE_CONNECTION.format(*(SERVER_CONNECTION.getpeername())))
|
||||
SERVER_CONNECTION.send(b"QUIT")
|
||||
SERVER_CONNECTION.close()
|
||||
sys.exit(0)
|
||||
|
||||
signal.signal(signal.SIGINT, handler)
|
||||
|
||||
SERVER_CONNECTION = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
try:
|
||||
SERVER_CONNECTION.connect((HOST, PORT))
|
||||
except ConnectionRefusedError as except_detail:
|
||||
print("ConnectionRefusedError: «{}». Unable to connect".format(except_detail))
|
||||
sys.exit()
|
||||
|
||||
print(MSG_SERVER_CONNECTED.format(HOST, PORT))
|
||||
inputs = [SERVER_CONNECTION]
|
||||
while 1:
|
||||
rlist, wlist, elist = select.select(inputs, [], [])
|
||||
|
||||
for socket in rlist:
|
||||
if socket == SERVER_CONNECTION: # incomming message
|
||||
data = socket.recv(BUFFER).decode()
|
||||
if not data:
|
||||
print(MSG_CLOSE_CONNECTION.format(HOST, PORT))
|
||||
sys.exit()
|
||||
else:
|
||||
#print data
|
||||
sys.stdout.write(data)
|
||||
|
||||
prompt()
|
|
@ -0,0 +1,82 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
flushserver.py
|
||||
|
||||
Time & networking test, talking script
|
||||
"""
|
||||
import datetime, select, signal, socket, sys, time
|
||||
|
||||
HOST = ''
|
||||
PORT = 5555
|
||||
BUFFER = 1024
|
||||
|
||||
SERVER_LOG = "{}:{}|{msg}"
|
||||
MSG_SERVER_STOP = "Server stop"
|
||||
MSG_START_SERVER = "Server is running, listening on port {}.\n\tPress <ctrl+c> to stop"
|
||||
|
||||
inputs = []
|
||||
|
||||
def handler(signum, frame):
|
||||
""" Catch <ctrl+c> signal for clean stop"""
|
||||
print()
|
||||
inputs.remove(MAIN_CONNECTION)
|
||||
i = 1
|
||||
for socket in inputs:
|
||||
print(SERVER_LOG.format(*socket.getpeername(), msg="closed client socket"))
|
||||
socket.close()
|
||||
i += 1
|
||||
inputs.clear()
|
||||
print(MSG_SERVER_STOP)
|
||||
MAIN_CONNECTION.close()
|
||||
sys.exit(0)
|
||||
|
||||
signal.signal(signal.SIGINT, handler)
|
||||
|
||||
def broadcast(sender, name, message):
|
||||
# send message to all clients, except the sender
|
||||
message = "\n~{}~ {}".format(name, message)
|
||||
for socket in inputs:
|
||||
if socket != MAIN_CONNECTION and socket != sender:
|
||||
try:
|
||||
socket.send(message.encode())
|
||||
except BrokenPipeError:
|
||||
print(SERVER_LOG.format(*socket.getpeername(), msg="closed client socket"))
|
||||
socket.close()
|
||||
inputs.remove(socket)
|
||||
|
||||
# Creation de la connection
|
||||
MAIN_CONNECTION = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
MAIN_CONNECTION.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
||||
MAIN_CONNECTION.bind((HOST, PORT))
|
||||
MAIN_CONNECTION.listen(5)
|
||||
inputs.append(MAIN_CONNECTION)
|
||||
print(MSG_START_SERVER.format(PORT))
|
||||
|
||||
while 1:
|
||||
# listening network
|
||||
rlist, wlist, xlist = select.select(inputs, [], [], 0.05)
|
||||
|
||||
for socket in rlist:
|
||||
# Listen for new client connection
|
||||
if socket == MAIN_CONNECTION:
|
||||
socket_object, socket_addr = socket.accept()
|
||||
inputs.append(socket_object)
|
||||
print(SERVER_LOG.format(*socket_addr, msg="connected"))
|
||||
msg_time = str(datetime.datetime.now()).split('.')[0]
|
||||
socket_object.send(msg_time.encode())
|
||||
|
||||
else: # receiving data
|
||||
data = socket.recv(BUFFER).decode().strip()
|
||||
peername = socket.getpeername()
|
||||
|
||||
if data.upper() == "QUIT":
|
||||
print(SERVER_LOG.format(*peername, name=None, msg="disconnected"))
|
||||
inputs.remove(socket)
|
||||
socket.close()
|
||||
|
||||
timestamp = time.localtime()
|
||||
if timestamp.tm_sec % 10 == 0:
|
||||
broadcast(None, "CLOCK", time.strftime('%Y-%m-%d %H:%M:%S', timestamp))
|
||||
time.sleep(1)
|
Loading…
Reference in New Issue