Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > server socket


Автор: YahоО 2.8.2017, 14:55
В Chrome открываю страницу своего сайта с скриптом:
Код

#!/usr/bin/perl
use IO::Socket::INET;
$| = 1;
my $socket = new IO::Socket::INET (
    LocalHost => '0.0.0.0',
    LocalPort => '8000',
    Proto => 'tcp',
    Listen => 1,
    Reuse => 1
);
die "cannot create socket $!\n" unless $socket;
my($data,$client_address,$client_port) = ('','','');
my($sec0,$min0,$hour0,$mday0,$mon0,$year0,$wday0,$yday0,$isdst0) =  localtime(time);
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=  localtime(time);
while($sec-$sec0<5){
 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=  localtime(time);
    my $client_socket = $socket->accept();
    $client_address = $client_socket->peerhost();
    $client_port      = $client_socket->peerport();
    $client_socket->recv($data, 1024);
    $client_socket->send('ok');
    shutdown($client_socket, 1);
    last;
}
$socket->close();
print "Content-type: text/html\n\n";
print "<html>connection from $client_address : $client_port <br>\n received data: $data \n <br>close</html>";

и при разных модификациях этого скрипта получаю или
Gateway Time-out
или
Internal Server Error
По идее страница в любом случае должна быть показана в браузере, даже без работы второго скрипта подключающегося к сайту по порту 8000.
Что то в общем не так, а что не так?

Автор: alezzz 3.8.2017, 09:31
какой-то велосипед по-моему, если нужен standalone без всяких апачей попробуйте http://perldancer.org 

Автор: YahоО 3.8.2017, 13:00
Код

#!/usr/bin/perl -w
use strict;
use Socket;
my $port = 8000;
my $proto = getprotobyname('tcp');
my $server = '0.0.0.0';  # Host IP running the server
socket(SOCKET, PF_INET, SOCK_STREAM, $proto)   or die "Can't open socket $!\n";
setsockopt(SOCKET, SOL_SOCKET, SO_REUSEADDR, 1) or die "Can't set socket option to SO_REUSEADDR $!\n";
bind( SOCKET, pack_sockaddr_in($port, inet_aton($server))) or die "Can't bind to port $port! \n";
listen(SOCKET, 5) or die "listen: $!";
my ($client_addr,$name);
my($sec0,$min0,$hour0,$mday0,$mon0,$year0,$wday0,$yday0,$isdst0) =  localtime(time);
my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=  localtime(time);
while(($sec+$min*60+$hour*60*60)-($sec0+$min0*60+$hour0*60*60)<5){
 ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
 if($client_addr = accept(NEW_SOCKET, SOCKET)){
   $name = gethostbyaddr($client_addr, AF_INET );
   print NEW_SOCKET "Smile from the server";
   close NEW_SOCKET;
 }
}
print "Content-type: text/html\n\n";
print "<html>SERVER started on port $port <br>Connection recieved from $name  <br> close</html>";

и так тоже не работает.

Точно велосипед. Эти скрипты нахожу в источниках с пометкой типа "рабочие", перепробовал несколько вариантов, но почему то ничто не срабатывает, не что зацепиться чтобы продолжить изучение темы.
Думаю хост настроен не для подобных манипуляций. Вчера нахожу еще одного free perl хостера бесплатного, создаю поддомен и тестирую эти скрипты, безрезультатно. Возможно на своем домене (не поддомене) результат все же как то бы и появился.
Апач не интересен, хотя скорее всего с ним скрипты сработали бы, т.к. localhost. Тестирую напрямую - прямо в интернете, либо работает, либо не работает.

Автор: alezzz 3.8.2017, 14:37
Сам сервер работает, подключитесь по telnet на порт 8000, увидите "Smile from the server" и закрытие сессии сервером. Непонятно что хотите получить, html контент в строках 22 и 23 ваш браузер не получит.

Автор: YahоО 3.8.2017, 15:21
alezzz спасибо!

html контент в строках 22 и 23 ваш браузер не получит - жаль конечно, я надеялся smile

Ищу и читаю пока о "use Dancer;".  
Теперь получается надо еще и по  telnet что найти.
Вопросы появятся, точнее они уже накапливаются - копаю ответы.




Автор: YahоО 3.8.2017, 20:55
На свой пк Dancer записал. Начинает откликаться.
Что нить пробовать буду.

Автор: alezzz 4.8.2017, 08:16
Чтоб быстрее откликался небольшой пример:
Код

#!/usr/bin/env perl

use strict;
use Dancer;

set port => 8000;

get '/' => sub {
    return 'Test';
};

dance;

Автор: YahоО 4.8.2017, 13:35
За пример спасибо!

Вчера начал с такого примера:
Код

get '/hello/:name' => sub {
        "Hello ".param('name');
};

ну и потратил почти час на чтение, чтоб получить первый отклик, потому что в моем примере была передача текста, а я ожидал что на :3000 сразу что то должно прийти, а надо что то же было и указать после hello.
А Ваш пример был бы подхвачен сразу же, и для старта он был бы лучше.

Автор: alezzz 4.8.2017, 14:50
Начинайте с самого простого, в вашем случае нужно было в браузере запросить http://<ip>:3000/hello/user чтоб получить на странице "Hello user".

Автор: YahоО 4.8.2017, 15:34
В браузере запросить http://<ip>:3000/hello/user пока что это только localhost, с этим все в порядке, работает, это мне понятно.

Не понятно: 

1) dancer слушает и отвечает ведь не по протоколу ws, а html js работает по протоколу WebSocket над TCP.  
Пробовал ajax отправить на localhost:3000, но
XMLHttpRequest cannot load file:///D:/........ Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
Получается на сервере надо иметь тоже протокол ws ?

2) Если все же dancer сработает на сервере сайта, то ведь надо его туда как то записать, т.е. просить support чтобы инсталлировали. А поскольку хостер бесплатный, то он может проигнорировать. В таком случае мне придется из dancer все методы собирать в новый dancer3, в один файл и уже его по фтп отправлять, чтобы тестировать дальше?

Автор: alezzz 4.8.2017, 17:07
по вебсокетам тут https://metacpan.org/pod/release/SUKRIA/Dancer-1.3000_02/lib/Dancer/Tutorial/WebSockets.pod , у меня работает один мелкий сервис по такому примеру.

Автор: YahоО 4.8.2017, 19:51
plackup -s Twiggy wsdemo.pl
эта строчка - заморочка, все ей не хватает какого либо .pm,
и кто вообще придумал когда то модули, пакеты, инкапсуляцию и адресацию, все разбито по кусочкам, нет чтобы все и сразу и в одном файле smile 
и не умирал бы cpan когда сегодня хочешь скачать/записать Plack или Danser2.


Автор: YahоО 7.8.2017, 00:50
"Smile from the server"  - есть отклик, но только там на сайте, только внутри сервера,  почему то.
Хост на видит запросы клиента с пк. Браузер не может соединиться с сайтом.
Как можно соединить сайт с пк?

Автор: YahоО 7.8.2017, 19:34
"Outgoing connections are disabled for accounts with the free hosting plan." - ответ моего хостера, что впрочем и следовало ожидать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)