Клиент-сервер калькулятор

[ ROT ]

13 Sep 2013

Задачка из курса Распределённых Объектных технологий.

Написано на чистых сокетах, интерактивно.

Клиент считывает ввод и отправляет серверу, сервер считает, возвращает ответ.

Код сервера:

#!/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

GitHub