Форум программистов, компьютерный форум, киберфорум
Python: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 21

Простой сервер

24.10.2017, 13:01. Показов 1314. Ответов 7

Студворк — интернет-сервис помощи студентам
Добрый день

Я совсем новичок.
Написал вот такой скрипт:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
 #!/usr/bin/env python3
import socket
import time
def parse(conn, addr):
    print("     Data received")
    data = b""  
    f = open('../index.html', 'w')
    while not b"#" in data: 
        data = conn.recv(1024)      
        udata = data.decode("utf-8")        
        print(udata)
        a = time.strftime("%Y-%m-%d-%H.%M.%S", time.localtime())        
        f.write(a)      
        f.write(udata + '\n')
    return
    f.close()
    
sock = socket.socket()
sock.bind( ("", 1904) )
sock.listen(10)
try:
    while 1:        
        conn, addr = sock.accept()
        conn.settimeout(60) 
        print("New connection from " + addr[0])
        try:            
            parse(conn, addr)           
        except:
            print("Error")
            send_answer(conn, "500 Internal Server Error", data="Ошибка")
        finally:
            print("Connection closed")
            conn.close()
finally: sock.close()
Назначение - принимать данные от некоего устройства и логгировать их.

Есть вопросы:

1) Скрипт “работает только один раз”. После разрыва соединения заново к нему соединится не получается.

2) Всё это крутится на хостинге и папка, куда сливаются данные (где лежит index.html) общедоступна.
По каким-то причинам файл появляется там с 10-15-минутным лагом.
Не пойму, то ли заморочки хостинга, то ли косяки у меня в скрипте.
Наверное правильно складывать всё это в MySQL базу данных, но пока в процессе освоения

3) Буду благодарен за указание на ошибки и косяки в скрипте.

Заранее огромное спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.10.2017, 13:01
Ответы с готовыми решениями:

Простой сервер на питоне
добрый день. Я только осваиваю Питон(раньше работал с шарпом, плюсами и джаваскриптом) есть у кого-то пример простого сервера? конкретно...

Простой веб-сервер с directories walk
В общем, на просторах инета уже многовато поискал информации, но сложновато все структуризировать и создать свой план действия. Смотрим...

Простой сервер
Не могли бы вы показать как написать простейший сервер, который бы отображал html страницу, которая содержит скрипт. Этот сервер подгружает...

7
Эксперт Python
5437 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
24.10.2017, 13:43
1)
Цитата Сообщение от iv_helper Посмотреть сообщение
Написал вот такой скрипт:
Скопировал - будет честнее.

2)
Цитата Сообщение от iv_helper Посмотреть сообщение
Скрипт “работает только один раз”
Точно такой же вариант (из статьи на одном сайте) взятый мной за основу работает сколько угодно раз.

3) Зачем вы поставили пустой return в функции parse? В оригинале все было правильно. А у вас файл index.html не закрывается корректно, по крайне мере строчка f.close() - недостижима.
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 21
24.10.2017, 15:42  [ТС]
Да, скопировал. Ну точнее переписал под себя и видимо допустил ошибку.

Добавлено через 2 минуты
Да, f.close() должен стоять перед return
А почему return не нужен? Он же закрывает функцию.

Добавлено через 6 минут
Часть по работе с файлом точно писал сам. А можно ссылку на то, что вы называете "оригиналом" ?
Заранее спасибо!
0
Эксперт Python
5437 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
24.10.2017, 23:35
Цитата Сообщение от iv_helper Посмотреть сообщение
Часть по работе с файлом точно писал сам
Ну это и так понятно :-)
Оригинал (точнее вариации этого кода), гуглятся по нескольким характерным строкам кода. Здесь, например.
Вам он вряд ли что-то даст - он слишком упрощен, поскольку написан автором в качестве элементарного примера и не учитывает все нюансы такого низкоуровнего интерфейса как сокеты.

У меня из его ~50 строк в итоге получилось 500 строк неблокирующего сервера, умеющего делать листинг директорий, генерировать html по шаблону, открывать файлы и посылать клиенту заголовки клиентского кэширования.
Вот ссылка на github, если захотите поизучать: специально залил, чтобы не выкладывать каждый раз здесь примеры реализаций серверов на сокетах.

P.S. Возможно, вам стоит присмотреться к готовым Http\TCP серверам из встроенных библиотек python, чем пытаться работать на таким низком уровне как сокеты.
Хотя, если у вас девайс понимает только сырые байты, тогда выбор, конечно, невелик. Но, может, и для вашего девайса есть внешняя либа.
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 21
25.10.2017, 00:38  [ТС]
Ок, спасибо большое за советы!

Ещё маленький вопрос. Подскажите пожалуйста.
Модифицировал код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env python3
import socket
import time
 
def parse(conn, addr):
    print("     Data received")
    data = b""              
    while not b"#" in data:         
        f = open('data.log', 'w')       
        data = conn.recv(1024)      
        udata = data.decode("utf-8")                
        a = time.strftime("%Y-%m-%d-%H.%M.%S", time.localtime())        
        print(a)                
        print(udata + '\n')     
        f.write(a)      
        f.write(udata + '\n')                   
        f.close()           
    return  
    
sock = socket.socket()
sock.bind( ("", 1904) )
sock.listen(10)
 
try:
    while 1:        
        conn, addr = sock.accept()
        conn.settimeout(60) 
        print("New connection from " + addr[0])
        try:            
            parse(conn, addr)           
        except:
            print("Error")
            send_answer(conn, "500 Internal Server Error", data="Ошибка")
        finally:
            print("Connection closed")
            conn.close()
finally: sock.close()
Проблема в следующем: скрипт генерит пустой файл, в который ничего не попадает.
Но стоит поменять "w" на "a" (открыть для дозаписи) - и всё работает!

Уже всю голову сломал. В чем же тут дело?
0
Эксперт Python
5437 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
25.10.2017, 01:13
Лучший ответ Сообщение было отмечено iv_helper как решение

Решение

Цитата Сообщение от iv_helper Посмотреть сообщение
Но стоит поменять "w" на "a" (открыть для дозаписи) - и всё работает!
Ну так режим "w" открывает файл только для записи. Указатель стоит в начале файла. Создает файл с именем имя_файла, если такового не существует.
Поэтому он всегда в таком режиме будет перезаписываться - тем более, что вы пишите в него и пустые данные. А это нужно отсекать проверкой. В том же примере с сайта andreymal.org в коде сразу после цикла считывания стоит такое:
Python
1
2
if not data:      # данные не пришли
        return        # не обрабатываем
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def parse(conn, addr):# обработка соединения в отдельной функции
    data = b""
    
    while not b"\r\n" in data: # ждём первую строку
        tmp = conn.recv(1024)
        if not tmp:   # сокет закрыли, пустой объект
            break
        else:
            data += tmp
    
    if not data:      # данные не пришли
        return        # не обрабатываем
     
    ....и только здесь уже что-то делаем с данными
То есть пустые данные не обрабатываются. А у вас все делается прямо в цикле - вот и результат.
1
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 21
25.10.2017, 01:21  [ТС]
Аааа! Ну конечно же!
Спасибо огромное!
0
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 21
26.10.2017, 07:48  [ТС]
Ещё раз здравствуйте

Продолжаю экспериментировать со своим скриптом.

Почему вот такой код (см. ниже) иногда генерит пустой файл:
Python
1
2
3
4
5
6
7
8
9
10
11
import time
 
while 1:  
  a = time.strftime("%Y-%m-%d-%H.%M.%S", time.localtime())
  time.sleep(1) 
  f = open("../index.html", "w")
  time.sleep(1) 
  f.write(a)    
  time.sleep(1)
  f.close()       
  time.sleep(10)
а с таким все нормально:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import time
 
while 1:  
  a = time.strftime("%Y-%m-%d-%H.%M.%S", time.localtime())
  if a:    
    time.sleep(1) 
    f = open("../index.html", "w")
    time.sleep(1) 
    f.write(a)    
    time.sleep(1)
    f.close()       
    time.sleep(1)                                        
  time.sleep(10)
Откуда берутся пустые данные в переменной "a"?
Тем более делается специальная пауза перед следующими операторами?

Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.10.2017, 07:48
Помогаю со студенческими работами здесь

Простой сервер
Нашел пример простого сервера... (я пользуюсь delphiXE3) section:TCriticalSection; с этим разобрался, надо было в uses добавить......

Простой сервер (sockets)
Есть простейший сервер на сокетах, написанный на PHP (исходный код находится в файле server.php). <?php error_reporting(E_ALL); ...

Простой хост сервер
Здравствуйте хочется попробовать написать простенький хост сервер для локальной сети. Подскажите куда смотреть что бы понять что мне надо...

Свой простой сервер
Здравствуйте. Имеется такая задача: Напишите простой сервер, который может получать строку из поля input (по GET и POST). В ответ он...

простой веб-сервер
Добрго времени суток! Написал простой веб-сервер. Возникли трудности с обменом данных по протоколу HTTP. Вот мой код с раскрытыми функциями...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Непрерывная интеграция для пакета Python
Mr. Docker 22.06.2025
Было 4 часа утра пятницы, когда я выпустил новую версию нашей внутренней библиотеки для обработки данных. Релиз 0. 5. 2 содержал небольшой фикс для обработки дат в ISO формате, что может пойти не так?. . .
Продвинутый ETL на C# из OLTP БД в хранилище
stackOverflow 22.06.2025
Работая в сфере корпоративной аналитики, я постоянно сталкиваюсь с одним и тем же - нужны чистые, структурированные и, главное, свежие данные. Без них современные аналитические системы, машинное. . .
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »