python server

This commit is contained in:
Andrew Gundersen 2021-01-18 11:43:30 -06:00
commit 7cc23bdabe
34 changed files with 107 additions and 0 deletions

57
server/packages.py Normal file
View file

@ -0,0 +1,57 @@
# server/packages.py
HEADER_LENGTH = 20
def pull(self, socket, cnvrt=False):
""" Recv a message and return type and data. If cnvrt is True and
type is 'aud', pull returns transcribed audio. """
msg_header = socket.recv(HEADER_LENGTH)
if not len(msg_header):
print("NO DATA RECEIVED")
return False
# Extract type and length from header.
msg_header = msg_header.decode('ascii')
msg_header = msg_header.strip()
msg_attrbs = msg_header.split('-')
msg_type = msg_attrbs[0]
msg_length = int(msg_attrbs[1])
# return package data object
package = {'type': msg_type, 'data': self.recvall(socket, msg_length)}
if cnvrt:
if package['type'] == 'aud':
package['data'] = self.transcribe(package['data'])
return package
def push(self, socket, data):
""" Send a message of any type. """
encoded_data = ''.join([data, '\0']).encode('ascii')
# makes eg. "txt-<length of msg>"
header = '-'.join(['txt', str(len(encoded_data))])
header = ''.join([header, '\0'])
encoded_header = f"{header:<{HEADER_LENGTH}}".encode('ascii')
socket.send(encoded_header + encoded_data)
def recvall(self, socket, length):
data = bytearray()
while len(data) < length:
packet = socket.recv(length - len(data))
if not packet:
return None
data.extend(packet)
return bytes(data)
def send_all(self, socket, data):
while data:
sent = socket.send(data)
data = data[sent:]

50
server/server.py Normal file
View file

@ -0,0 +1,50 @@
import time
import socket
import threading
import packages
# port settings
IP = '127.0.0.1'
PORT = 1040
class Server(pkgs.PackageHandler):
def __init__(self, ip, port):
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# Socket settings
self.server_socket.setsockopt(
socket.SOL_SOCKET,
socket.SO_REUSEADDR,
1)
self.server_socket.bind((ip, port))
self.server_socket.listen()
print(f'Listening for connections on {ip}:{port}')
self.server_loop()
def server_loop(self):
while True:
client_socket, client_address = self.server_socket.accept()
print(f"Accepted new connection from {client_address}")
package = self.pull(client_socket)
if package:
if package['type'] != 'con':
continue
user_id = int(package['data'].decode('ascii'))
print(f"Received user ID: {user_id}")
self.push(client_socket, "Hello from the Server!")
while True:
self.push(client_socket, "Connection still alive!")
time.sleep(2)
if __name__ == '__main__':
server = Server(IP, PORT)