Форум сайта python.su
0
Задача: Сделать простых клиента и сервера, работающих по HTTP. Тип запроса (GET или POST) не важен.
1. Сервер
После запуска доступен по порту TCP 9999.
При получении данных от клиента распаковывает MSGPACK, далее в полученном JSON'е проверяет поле test_date регулярным выражением на формат 01.01.1111 (день.месяц.год4цифры).
Если дата в этом формате - возвращает {“result”:“ok”} также упакованный в MSGPACK. Если нет - {“result”:“error”} также упакованный в MSGPACK
2. Клиент
После старта посылает запрос на сервер с данными даты в формате 01.01.1111 и выводит ответ сервера в консоль. После - то же самое, только с датой в другом формате и с выводом результата.
Учитывайте, что на клиенте необходимо упаковывать данные в MSGPACK перед отправкой, а также распаковывать при получении, так как сервер работает только с MSGPACK.
#!/usr/bin/env python # -*- coding: utf-8 -*- import socket import json import msgpack import re def check_field(data): data = msgpack.unpackb(data) data = json.loads(data) test_date = data.get('test_date') result = re.search(r'(0[1-9]|[12][0-9]|3[01])[- .](0[1-9]|1[012])[- .]\d\d', test_date) if result == None: return msgpack.packb(json.dumps({"result":"error"})) else: return msgpack.packb(json.dumps({"result":"ok"})) """ server """ sock = socket.socket() sock.bind(('127.0.0.1', 9999)) sock.listen(5) conn, addr = sock.accept() print 'connected:', addr while True: data = conn.recv(2048) if not data: break conn.send(check_field(data)) conn.close() """ end server """
#!/usr/bin/env python # -*- coding: utf-8 -*- import socket import json import msgpack date_array = ['10.01.2016', '10a.01.2016'] conn = socket.socket() conn.connect( ('127.0.0.1', 9999) ) for i in date_array: data = {'test_date':i} data = json.dumps(data) data = msgpack.packb(data) conn.send(data) result = conn.recv(2048) result = msgpack.unpackb(result) result = json.loads(result) print(result.get('result') ) conn.close()
Отредактировано butovichev (Янв. 19, 2016 23:17:05)
Офлайн
568
butovichevТо есть возможно? Вам разумеется придется использовать сокеты, хотите вы того или нет. HTTP - это текстовый протокол, описывающий запрос клиента и ответ сервера. Это не транспортный протокол, транспортный протокол - TCP/IP. Вам нужен будет прежде всего TCP-сервер. Хотя, может быть, у вас какое-нибудь экзотическое решение, основанное на другом транспортном протоколе, но ИМХО без сокетов не обойтись никак.
Возможно ли при такой постановке задачи использовать сокеты?
Отредактировано FishHook (Янв. 19, 2016 16:37:27)
Офлайн