Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 19, 2016 16:05:47

butovichev
Зарегистрирован: 2015-10-16
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Верно ли я выполнил задание?

Задача: Сделать простых клиента и сервера, работающих по 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()

Сделал данную задачу через стандартный модуль сокетов, все работает! Но меня смущает что в моем коде нигде нет http и соответсвенно get или post запросов.

Как можно реализовать данную задачу используя http?

Отредактировано butovichev (Янв. 19, 2016 23:17:05)

Офлайн

#2 Янв. 19, 2016 16:34:47

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Верно ли я выполнил задание?

butovichev
Возможно ли при такой постановке задачи использовать сокеты?
То есть возможно? Вам разумеется придется использовать сокеты, хотите вы того или нет. HTTP - это текстовый протокол, описывающий запрос клиента и ответ сервера. Это не транспортный протокол, транспортный протокол - TCP/IP. Вам нужен будет прежде всего TCP-сервер. Хотя, может быть, у вас какое-нибудь экзотическое решение, основанное на другом транспортном протоколе, но ИМХО без сокетов не обойтись никак.



Отредактировано FishHook (Янв. 19, 2016 16:37:27)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version