Форум программистов, компьютерный форум, киберфорум
Фаер
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Python. Web-приложения.

Запись от Фаер размещена 09.01.2013 в 17:36
Показов 5459 Комментарии 0
Метки python, сервер

Пожалуй, каждый в душе мечтает завести свой собственный сайт. По хорошему, для этого Вам нужно арендовать "белый" IP-адрес, который будет виден из Интернета. Так же можно прибегнуть к услугам особых компаний, которые предоставляют домены взамен на право размещать на Вашем сайте рекламу. Кроме того, чтобы создать серьёзный сайт, Вам нужно знать HTML, CSS и ещё тучу всякой ереси. Пока что в такие дебри Мы лезть не будем, а посмотрим как можно создать локальный сервер, не доступный из Интернета. При этом, Вам не обязательно иметь второй компьютер или целую локальную сеть. Клиенты будут запускаться прямо на том же ПК, что и сервер, только в других процессах.

Первое, что Нам нужно, это IP-адрес будущего сервера(то есть, Вашего компьютера) в сети. Нажмите Пуск->Выполнить. Впишите в поле для ввода 'cmd', чтобы вызвать командную строку. Затем напишите ipconfig/all. В ответ Вы получите информацию о доступных на данном компьютере сетевых интерфейсах. Теперь Вам нужно найти что-то типа "Подключение по локальной сети - Internet адаптер". В этом разделе найдите строку 'IP-адрес .......x.x.x.x'. У Меня, например, там написано "192.168.0.2". Если, проделав вышеописанные операции, Вы так и не нашли IP, не беда, всегда можно использовать адрес 127.0.0.1, а можно и, вообще, вместо адреса ввести строку 'localhost' и все дела.

Далее. Вам нужно знать, что такое сокеты. Строгое определение этого понятия можно найти в Википедии и т.п. сайтах. Если же сказать просто и кратко, то сокет - это труба, по которой процессы могут гонять информацию друг другу. Естественно, эти процессы могут выполняться на компьютерах, связанных друг с другом через WWW. Сокет, в общем-то, и является основным инструментом передачи данных в Интернете. Следует заметить, что сокеты присоединяются друг к другу через порт. Каждый порт имеет свой ID - номер.

Желательно, по крайней мере пока, не использовать порты с номерами 0-1023, так как они зарезервированы под стандартные протоколы передачи данных.

В общем и целом, для того, чтобы создать элементарный сервер и клиентов, знать что-то ещё не очень-то и нужно. Следовательно, Мы переходим непосредственно к написанию программ.

Сервер

Сервер - программа, которая подключается к порту и "слушает" его. Если обнаруживается входящее подключение, сервер принимает информацию от клиента и отправляет ответ.

Python
1
2
3
4
5
6
7
8
9
10
11
12
from socket import *
 
sock=socket(AF_INET,SOCK_STREAM)#создаём сокет TCP/IP(в подробности пока не вдаёмся)
sock.bind(('',1808))       #указываем номер порта, к которому ожидается подключение
sock.listen(2)          #указываем максимальное кол-во ожидающих клиентов
 
while True:
    connection,address=sock.accept()#принимаем входящее поключение
    data=connection.recv(64)#читаем данные блоками по 64 байта
    print(data.decode())
    connection.send(b'Hi,client!')#отправляем ответ
    connection.close()
Итак, Мы создаём сервер TCP/IP, который прослушивает порт 1808. Номер порта, к которому подключается сервер должен совпадать с таковым у клиента. Переданная в bind() пустая строка, означает, что сервер будет использовать все доступные сетевые интерфейсы. Обратите внимание, что после того, как клиент подключился, Мы используем не сокет, а поключение(connection). Так же Вы, должно быть, заметили, что перед отправкой данные переводятся в строки байтов. Не забывайте об этом, сокеты работают только с байтами.

Клиент

Клиент - программа, которая подключается к порту и передаёт на сервер некоторую информацию, а затем получает ответ.

Python
1
2
3
4
5
6
7
8
9
from socket import *
 
sock=socket(AF_INET,SOCK_STREAM)
sock.connect(('192.168.0.2',1808))
sock.send(b'Hello,Server!')
 
data=sock.recv(64)#читаем 64-байтовый блок
sock.close()
print(data.decode())
Так же создаём объект сокета TCP/IP, затем поключаем его к серверу(если с IP возникли какие-то проблемы, можете вместо него вписать строку 'localhost'), передаём на сервер строку байтов и получаем ответ.

Теперь запустите сервер, а затем клиент. В результате, каждый из них должен вывести на экран строку, полученную от собеседника(не забывайте, что при работе в консоли нужно писать input(), чтобы успеть прочитать то, что выводит программа).

Если помните, в программе сервера, с помощью метода listen(), Мы указали максимальное кол-во ожидающих клиентов, равное двум. Это означает, что, пока сервер обрабатывает запрос одного клиента, ещё два могут стоять в очереди. А вот если попробует подключиться третий(четвёртый, если считать того, с которым сервер уже работает), то его запрос будет отклонён. Конечно, в данной программе такая проблема вряд ли возникнет, но так, на будущее, скажу, что решить её можно с помощью старых-добрых параллельных потоков.

А теперь давайте передадим через сокет какой-нибудь файл, например html. Если Вы не знаете HTML, то просто скопируйте код, размещённый ниже и занесите его в текстовый файл. Затем измените расширение файла на .html и получите самый настоящий HTML-файл.

HTML5
1
2
3
4
5
6
7
8
9
<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Web</title>
</head>
<body>
<p>Hello,man!</p>
</body>
</html>
Теперь перейдём к серверу:

Python
1
2
3
4
5
6
7
8
9
10
11
12
from socket import *
 
file=open('C:\\page.html','rb')#открываем файл в режиме чтения байтов
sock=socket(AF_INET,SOCK_STREAM)
sock.bind(('',1808))
sock.listen(2)
 
while True:
    connection,address=sock.accept()
    for line in file:                  #читаем строки байтов из файла
        connection.send(line)    #и отправляем их клиенту
    connection.close()
Как видите, даже новых функций/классов не понадобилось, всё элементарно.

Клиент:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from socket import *
import os
from time import sleep
 
file=open('C:\\Documents and Settingsользовательабочий стол\\page.html','wb')
 
sock=socket(AF_INET,SOCK_STREAM)
sock.connect(('192.168.0.2',1808))
sleep(0.25)
data=sock.recv(512)
file.write(data)
 
file.close()
os.startfile('C:\\Documents and Settingsользовательабочий стол\\page.html')
В клиенте тоже, в общем-то, ничего сложного нет. Создаём сокет, подключаем его к порту, читаем строку длиной 512 байтов и записываем её в файл. После того, как файл написан, открываем его с помощью os.startfile. Так как это HTML-файл, открыт он будет, соответственно, в браузере. В общем, всё кратко и просто.
Метки python, сервер
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru