Найти - Пользователи
Полная версия: Верно ли я выполнил задание?
Начало » Python для новичков » Верно ли я выполнил задание?
1
butovichev
Задача: Сделать простых клиента и сервера, работающих по 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?
FishHook
butovichev
Возможно ли при такой постановке задачи использовать сокеты?
То есть возможно? Вам разумеется придется использовать сокеты, хотите вы того или нет. HTTP - это текстовый протокол, описывающий запрос клиента и ответ сервера. Это не транспортный протокол, транспортный протокол - TCP/IP. Вам нужен будет прежде всего TCP-сервер. Хотя, может быть, у вас какое-нибудь экзотическое решение, основанное на другом транспортном протоколе, но ИМХО без сокетов не обойтись никак.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB