Задачка из курса Распределённых Объектных технологий.
Написано на чистых сокетах, интерактивно.
Клиент считывает ввод и отправляет серверу, сервер считает, возвращает ответ.
Код сервера:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import socket
HOST = ''
PORT = 27001
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(5)
while True:
conn, addr = s.accept()
print('Connected by', addr)
while True:
data = ""
c = ''
while c != '\n':
c = conn.recv(1).decode()
if c:
data += c
else:
break
if data and data != "quit\n":
try:
message = "{}\n".format(eval(data.strip()))
except Exception as e:
message = "Invalid input\n"
conn.sendall(message.encode())
else:
break
conn.close()
Код клиента:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import socket
class Client(object):
def __init__(self, host, port):
self.host = host
self.port = port
def connect(self):
self.sock = socket.create_connection((self.host, self.port))
def send_request(self, req):
return self.sock.send("{}\n".format(req).encode())
def get_reply(self):
recv = self.sock.recv(512)
return recv.decode()
def print_help(argv):
usage = "Usage: {0} host port".format(argv[0])
print(usage)
def main():
if len(sys.argv) != 3:
print_help(sys.argv)
sys.exit(1)
host, port = sys.argv[1:3]
client = Client(host, port)
client.connect()
while True:
req = input("Client> ")
client.send_request(req)
if req == "quit":
break
print("Server> {0}".format(client.get_reply().strip()))
if __name__ == "__main__":
main()
Запуск клиента:
python client.py host port # в сервере порт 27001