PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » OpenSource » Пример WEB-сервера на PureBasic


Пример WEB-сервера на PureBasic

Сообщений 1 страница 30 из 50

1

Вот небольшой пример веб-сервера, который работает совместно с любым браузером.

Код:
#ProgName="Web-сервер - пример"
Port=80 ; На этом порту будет работать сервер
*Buffer = AllocateMemory(10000)
If InitNetwork() = 0
  MessageRequester(#ProgName, "Ошибка инициализации сетевой библиотеки!", #MB_OK|#MB_ICONERROR)
  End
EndIf


If CreateNetworkServer(2, Port , #PB_Network_TCP)
  
  Repeat
    SEvent = NetworkServerEvent()
    If SEvent
      ClientID = EventClient()
         Select SEvent
           Case #PB_NetworkEvent_Connect ; Новый клиент подключился к серверу
             
           Case #PB_NetworkEvent_Data    ; От клинета пришли данные
             ReceiveNetworkData(ClientID, *Buffer, 10000)
             SendNetworkString(ClientID, "HTTP/1.0 200 OK"+Chr($0D)+Chr($0A))
             SendNetworkString(ClientID, "Server: "+#ProgName+Chr($0D)+Chr($0A))
             SendNetworkString(ClientID, "Content-Length: "+Str(?M2-?M1)+Chr($0D)+Chr($0A))
             SendNetworkString(ClientID, "Content-Type: text/html"+Chr($0D)+Chr($0A))
             SendNetworkString(ClientID, Chr($0D)+Chr($0A))
             SendNetworkData(ClientID, ?M1, ?M2-?M1)
             
           Case #PB_NetworkEvent_File    ; От клиента пришел файл
             
           Case #PB_NetworkEvent_Disconnect  ; Клиент разорвал соединение с сервером
             
         EndSelect      
    Else
      Delay(20)
    EndIf
  ForEver
   
Else
  MessageRequester(#ProgName, "Не удалось создать сервер на "+Str(Port)+" порту!", #MB_OK|#MB_ICONERROR)
EndIf
End

DataSection
  M1:
  IncludeBinary "Пример Web-сервера.html"
  M2:
EndDataSection

Запускаем его и в браузере вводим адрес http://127.0.0.1/
В итоге, в браузере отобразится веб-страничка, содержимое которой хранится в файле "Пример Web-сервера.html".

Файлы http://pure-basic.narod.ru/forum_files/WebServer_PB.rar

0

2

Работает !
То есть - это типо Apache ?

А как правильно прописать, чтоб не загружать "файл.html" в EXE ?

Отредактировано mirashic (17.12.2010 22:25:21)

0

3

Можно жестко прописать HTML код в проге, а можно динамически его генерировать.
Вот здесь

SendNetworkString(ClientID, "Content-Length: "+Str(?M2-?M1)+Chr($0D)+Chr($0A))

надо указать размер в байтах, веб странички, а эта строка

Код:
SendNetworkData(ClientID, ?M1, ?M2-?M1)

передаёт страничку браузеру (клинету сервера).
Если страничка хранится в строковой переменной, то в место функции SendNetworkData можно использовать SendNetworkString.

0

4

Кому интересно как это работает введите в адресной строке браузера тут была ссылка

0

5

Пётр написал(а):

передаёт страничку браузеру (клинету сервера).

Спасибо, Пётр, очень интересный и компактный код!!! Получается, можно простыми средствами организовать страничку на своем компе…
А можно ли в качестве IP адреса сервера указать динамический IP адрес ADSL-модема. И чтобы любой пользователь из internet по IP мог получить эту страничку??? Можно ли выйти за пределы локальной сети?

Отредактировано Lucagin (18.12.2010 18:14:44)

0

6

У меня ADSL модем.
IP адрес указал в четвёртом посте этой темы (сейчас ссылка работает). Скопируй в браузер и перейди по тому адресу.
Если модем настроен роутером, для для работы сервера (приёма входящих соединений), нужно открыть порт сервера (сейчас у меня открыт порт 2020, что отражено в ссылке).

Если у вас нет выделенного
адреса и IP динамический
И в этом случае расстраивать-
ся не стоит. Выход из положения
есть… Достаточно посетить, на-
пример, сайт http://www.dynip.com, с которого можно
скачать небольшую программку
(~3Mb). После чего, запустив ее, вы
сможете создать глобальный линк
(переадресацию) на свой компью-
тер. Ссылка в Интернете будет выг-
лядеть следующим образом:
http://ваше название.dynip.com и лю-
бой, кто наберет в браузере этот
адрес, попадет к Вам на компью-
тер...

0

7

Пётр написал(а):

У меня ADSL модем.IP адрес указал в четвёртом посте этой темы (сейчас ссылка работает). Скопируй в браузер и перейди по тому адресу.Если модем настроен роутером, для для работы сервера (приёма входящих соединений), нужно открыть порт сервера (сейчас у меня открыт порт 2020, что отражено в ссылке).

Когда писал сообщение, 4-го поста еще не было…:о)) А ведь динамический Ip-адрес, это тот же прямой (выделенный) IP, только не постоянный, если клиент точно знает IP-адрес(динамический) и открытый порт, то можно же по IP-адресу сервера получить страничку, чтобы не пользоваться сторонними DNS-серверами (http://www.dynip.com) или это  все равно необходимо?
А в коде программы где-то специально указывается IP-ADSL роутера или он обрабатывает все сообщения от браузера пользователя на этот порт?

Отредактировано Lucagin (18.12.2010 18:33:08)

0

8

Lucagin написал(а):

А ведь динамический Ip-адрес, это тот же прямой (выделенный) IP, только не постоянный, если клиент точно знает IP-адрес(динамический) и открытый порт, то можно же по IP-адресу сервера получить страничку, чтобы не пользоваться сторонними DNS-серверами (http://www.dynip.com) или это  все равно необходимо?

Если точно знать IP адрес, то не нужно использовать что-то типа dynip.com
Но проблема динамического адреса в том, что выключу я сейчас модем, а потом включу и все, адрес поменяется и эта ссылка не будет вести на мой комп.
Сервисы типа dynip.com позволяют избежать этого.

Lucagin написал(а):

А в коде программы где-то специально указывается IP-ADSL роутера или он обрабатывает все сообщения от браузера пользователя на этот порт?

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

0

9

Пётр написал(а):

Если точно знать IP адрес, то не нужно использовать что-то типа dynip.comНо проблема динамического адреса в том, что выключу я сейчас модем, а потом включу и все, адрес поменяется и эта ссылка не будет вести на мой комп.Сервисы типа dynip.com позволяют избежать этого.

У некоторых роутеры работают месяцами, это получается практически выделенный Ip-адрес. Планировал эту систему использовать именно со знакомыми, которые точно будут знать текущий динамический IP. Я так понимаю чуть модифицировав код и введя фильтр на входящий ip-адрес и ,быть может, исходящий порт,(или mac-адрес если в одной сети) можно организовать прекрасную программу для общения или пересылки файлов, а может и для видео конференций…!? А также Удаленное управление компьютером через интернет/сеть... Вот только фильтр входящих  ip на этот порт, лучше наверно делать средствами Брандмауэра самого роутера  для обеспечения лучшей  безопасности?

Отредактировано Lucagin (18.12.2010 19:05:02)

0

10

Lucagin написал(а):

У некоторых роутеры работают месяцами, это получается практически выделенный Ip-адрес.

Получается что так.

Lucagin написал(а):

Я так понимаю чуть модифицировав код и введя фильтр на входящий ip-адрес и ,быть может, исходящий порт,(или mac-адрес если в одной сети) можно организовать прекрасную программу для общения или пересылки файлов

IP адрес может получать сама программа

Код:
IP_Address.s=IPString(GetClientIP(EventClient()))

Порт клиента

Код:
PortClient = GetClientPort(EventClient())

Этот код следует выполнить при возникновении события сервера.
Если IP или порт не тот что нужно - просто не отвечать и все.

0

11

Пётр написал(а):

Этот код следует выполнить при возникновении события сервера.Если IP или порт не тот что нужно - просто не отвечать и все.

Очень классно, направлений применения кода море… А  сложно будет организовать через эту программу удаленное управление компьютером? Можно же передавать клиенту от сервера с частотой хотя бы 10кадр/сек скриншоты  экрана, а с другой стороны по команде менять координаты курсора и организовывать клики в нужном месте… ?

Отредактировано Lucagin (18.12.2010 19:26:42)

0

12

Не получается подсоединить внешний html файл .
В браузере показывает только строка с полным путём к файлу ?

Код:
#ProgName="Web-сервер - пример"
Port=80 ; На этом порту будет работать сервер
*Buffer = AllocateMemory(10000)
If InitNetwork() = 0
  MessageRequester(#ProgName, "Ошибка инициализации сетевой библиотеки!", #MB_OK|#MB_ICONERROR)
  End
EndIf

patch.s="file://localhost/"+GetPathPart(ProgramFilename())+"404.htm"  ; полный путь к htm файлу
Len_HTML=Len(patch.s)

If CreateNetworkServer(2, Port , #PB_Network_TCP)
  Repeat
    SEvent = NetworkServerEvent()
    If SEvent
      ClientID = EventClient()
         Select SEvent
           Case #PB_NetworkEvent_Connect ; Новый клиент подключился к серверу
           Case #PB_NetworkEvent_Data    ; От клинета пришли данные
             ReceiveNetworkData(ClientID, *Buffer, 10000)
             SendNetworkString(ClientID, "HTTP/1.0 200 OK"+Chr($0D)+Chr($0A))
             SendNetworkString(ClientID, "Server: "+#ProgName+Chr($0D)+Chr($0A))
             SendNetworkString(ClientID, "Content-Length: "+Str(Len_HTML)+Chr($0D)+Chr($0A))
             SendNetworkString(ClientID, "Content-Type: text/html"+Chr($0D)+Chr($0A))
             SendNetworkString(ClientID, Chr($0D)+Chr($0A))
             SendNetworkString(ClientID, patch.s)
           Case #PB_NetworkEvent_File    ; От клиента пришел файл
           Case #PB_NetworkEvent_Disconnect  ; Клиент разорвал соединение с сервером  
         EndSelect      
    Else
      Delay(20)
    EndIf
  ForEver
Else
  MessageRequester(#ProgName, "Не удалось создать сервер на "+Str(Port)+" порту!", #MB_OK|#MB_ICONERROR)
EndIf
End

Len_HTML=Len(patch.s) надо наверно вес самого файла, а не строки...

Отредактировано mirashic (18.12.2010 19:29:35)

0

13

Lucagin написал(а):

Можно же передавать клиенту от сервера с частотой хотя бы 10кадр/сек скриншоты  экрана, а с другой стороны по команде менять координаты курсора и организовывать клики в нужном месте… ?

Можно, но лигичнее в этом случае создавать не веб-сервер, с две программы, одна будет сервером, а другая клиентом, заточные для работы с друг с другом.
Вот пример чата http://purebasic.info/phpBB2/viewtopic.php?t=922
Вот пример IRC-клиента http://pure-basic.narod.ru/forum_files/IRC_source.rar

mirashic написал(а):

Не получается подсоединить внешний html файл .В браузере показывает только строка с полным путём к файлу

Нужно отправлять не путь, а содержимое файла.
Открываешь файл с помощью ReadFile, читаешь его в строковую переменную и отправляешь эти данные клиенту (браузеру).

0

14

Пётр написал(а):

Можно, но лигичнее в этом случае создавать не веб-сервер, с две программы, одна будет сервером, а другая клиентом, заточные для работы с друг с другом.Вот пример чата -- пример IRC-клиента http://pure-basic.narod.ru/forum_files/IRC_source.rar

Спасибо, Пётр!!! Буду пробовать,очень интересная тема…

0

15

Да я уже разобрался, где ошибка, внешний файл подключил, но не работают ссылки и отображение  картинок.
Попробую указать абсолютные ссылки...

0

16

mirashic написал(а):

Да я уже разобрался, где ошибка, внешний файл подключил, но не работают ссылки и отображение  картинок.

Для этого нужно дорабатывать прогу.
Ведь запрос браузера не обрабатывается а просто передается ему страницка.
В запросе, браузер указывает что ему надо, какая страницка, какой рисунок и т. д.

0

17

Абсолютные инет. ссылки работают, а локальные не получается ?...

0

18

mirashic написал(а):

Абсолютные инет. ссылки работают, а локальные не получается

По инет ссылкам, браузер заходит на серверы, где находятся эти странички, а чтобы работали локальные ссылки, код надо дорабатывать.

0

19

mirashic написал(а):

не работают ссылки и отображение  картинок.

Доработал программу http://pure-basic.narod.ru/forum_files/ … r_v1.2.rar

Поддерживается:
Отображение HTML страничек с рисунками и переход между страничками.
Скачивание файлов.

Код пока сырой, но уже сейчас, с его помощью можно разместить на своём компе небольшой HTML сайт, который можно будет посещать из локалки или инета (если есть статический IP).

Для примера, взял учебник Владимира.

Как пользоваться программой:
Распаковываем архив и запускаем WebServer_HTML.exe (закрывать его можно только через диспетчер задач, стандартной точки выхода нет).
После этого, на компе начинает функционировать веб-сервер.
Со своего компа можно его посетить, набрав в адресной строке браузера http://127.0.0.1/
Для для того, чтобы зайти из инета, нужно на другом компе, ввести IP адрес вашего компа.

0

20

Пётр написал(а):

Поддерживается: Отображение HTML страничек с рисунками и переход между страничками. Скачивание файлов.

Спасибо, Пётр, за программу и ее доводку, очень нужная программа…!!! Спасибо за учебник Влада, все кругом про него говорили, но никак не мог на него выйти, то ссылка битая, то еще что-то…:о)
А скажи, есть где-нибудь подробная справка (С примерами) по 3D-программированию  на PB, желательно на русском, а то справка по этому разделу не переведена, у тебя на страничке тоже этот раздел пока отсутствует… Тут с русской то справкой не факт что разберусь, а с английской вообще подступаться страшно… :о)

0

21

Пётр, при запуске программы, пишет "не удалось создать сервер на 80 порту"...??? С чем это связано, надо открыть порт на ADSL или с чем-то еще???

80-й порт на вход открыл, всё равно ошибка осталась...

Отредактировано Lucagin (20.12.2010 00:51:03)

0

22

Обновил программу, она по прежнему доступна по адресу http://pure-basic.narod.ru/forum_files/ … r_v1.2.rar
Была утечка памяти - во время отладки в процедуре Send_File закомментировал строку FreeMemory(*HTML_Code) и забыл разкомментировать.

Lucagin написал(а):

пишет "не удалось создать сервер на 80 порту"

Возможно какая-то прога уже выступает в качестве сервера и использует 80 порт.

Найди в исходном тексте проги строку (она в начале программы)

Код:
Port=80 ; На этом порту будет работать сервер

и поменяй порт, скажем на 2000.
В этом случае, ссылка будет иметь вид 127.0.0.1:2000

Кстати, сейчас запущен сайт на моём компе.
Зайти можно по ссылке тут была ссылка

0

23

Пётр написал(а):

Возможно какая-то прога уже выступает в качестве сервера и использует 80 порт.

уже сам догадался... :о))Уже была запущена предыдущая версия... как-то и не заметил что она работает и не выгрузил из процессов :о))

Пётр написал(а):

Кстати, сейчас запущен сайт на моём компе.

Сейчас протестируем.. 8-)

Отредактировано Lucagin (20.12.2010 01:06:31)

0

24

Пётр написал(а):

Кстати, сейчас запущен сайт на моём компе.Зайти можно по ссылке 95.153.110.210:2000

Все работает замечательно, отличий с оригиналом не заметил…:о)
А интересно, если есть доменное имя, можно к  программе его как-то прикрутить ,чтобы страница открывалась по DNS-имени а не по адресу???

0

25

Lucagin написал(а):

А интересно, если есть доменное имя, можно к  программе его как-то прикрутить ,чтобы страница открывалась по DNS-имени а не по адресу

Наверное можно (сам не пробовал), но если IP статический или очень редко меняется, а если динамический, то наверное удобнее использовать сервис dynip.com

0

26

127.0.0.1:1000 работает, а на внешний свой Ip почему-то зайти не могу..

Модем настроен как роутер. Фаервол в модеме отключен (Disables). Фаервол в системе выключен, а всё равно не пускает… Пинг внешнего Ip идет, а зайти на сервак не могу…  :no:  :dontknow:

Отредактировано Lucagin (20.12.2010 04:52:33)

0

27

Lucagin написал(а):

а на внешний свой Ip почему-то зайти не могу

Хочешь попасть со своего компа на свой же комп через инет? Такого маршрута ведь несуществует!
Нужно использовать прокси-сервер. Например, в браузере "Opera" есть туробо режим. Включаем его (будет использоваться прокси оперы) и заходим на свой комп по внешнему IP.

0

28

Пётр написал(а):

Хочешь попасть со своего компа на свой же комп через инет? Такого маршрута ведь несуществует!Нужно использовать прокси-сервер. Например, в браузере "Opera" есть туробо режим. Включаем его (будет использоваться прокси оперы) и заходим на свой комп по внешнему IP.

Использование режима  турбо в опере проблемы не решило. Попробуй зайти на мой сервер, работает или нет??? 95.165.219.214:1000

0

29

Не открывается.
Попробуй перейди по адресу 127.0.0.1:1000
Если получится, то значит нужно открыть порт в роутере.

0

30

Пётр написал(а):

Не открывается.Попробуй перейди по адресу 127.0.0.1:1000Если получится, то значит нужно открыть порт в роутере.

127.0.0.1:1000 работает.  Я стенку в ADSL-модеме полностью отключил. При этом вроде все порты должны быть открыты!?

95.165.219.214:80 заходит на сам роутер…

Отредактировано Lucagin (20.12.2010 14:52:10)

0


Вы здесь » PureBasic - форум » OpenSource » Пример WEB-сервера на PureBasic