Web-сервис на php-сокетах (сокет-сервер)

Тема в разделе "Как сделать...", создана пользователем despainer, 9 дек 2008.

Статус темы:
Закрыта.
  1. despainer

    despainer

    Регистр.:
    15 фев 2008
    Сообщения:
    615
    Симпатии:
    168
    Пишу чат-сервер на сокетах (тоесть не требующий web-сервера),но встала проблема: необходимо сделать так чтобы при обращении к серверу (порт 10000 на котором висит демон) броузером сервер выдавал web-страницу (тоесть примерно такое)-пример html-кода
    <html>
    <head><title>Тестовая страница</title>
    </head>
    <body>
    <center><h1>Это тестовая страница</h1></center>
    </body>
    </html>


    Естественно надо чтобы выдавался не код (как сейчас) а именно страница.

    Проблема в том что я открываю сокет привязываю его к порту и IP и начинаю прослушивать сокет но при подключении клиента выводится белый экран при просмотре исходного кода показывается код который я приводил выше,при подключении я отправлял заголовки согласно стандарту HTTP (вроде) и код страниы но все равно код не выполняется..
    Подскажите либо как правильно отправлять клиенту заголовки и код страницы чтоб он нормально выполнился,с поправкой на многопоточность.
     
  2. HatoL

    HatoL

    Регистр.:
    5 фев 2008
    Сообщения:
    206
    Симпатии:
    36
    может стоит отдавать правильный mime-type (text/html) ?
     
  3. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    Добавь в начале
    Код:
    header("Content-Type: text/html; charset=utf-8");
     
  4. despainer

    despainer

    Регистр.:
    15 фев 2008
    Сообщения:
    615
    Симпатии:
    168

    200 OK HTTP/1.1\r\n //Говорим что это HTTP-сервер
    . "Connection: close\r\n"
    . "Content-Type: text/html\r\n" //Тип документа
    . "\r\n"

    Потом отправляю остальные теги <html><head><body> и тд




    Вот что отправляю
    Что неправильно?
     
  5. DIAgen

    DIAgen Постоялец

    Регистр.:
    30 окт 2006
    Сообщения:
    134
    Симпатии:
    72
    Вот тебе реальный пример, ответ сервера нуледа
    P.S. пот почитай еще вот это http://ru.wikipedia.org/wiki/HTTP
     
  6. despainer

    despainer

    Регистр.:
    15 фев 2008
    Сообщения:
    615
    Симпатии:
    168
    Так у меня также в примере,просто убраны необязательные строки.
     
  7. admLoki

    admLoki генератор случайного PHP

    Регистр.:
    14 сен 2006
    Сообщения:
    481
    Симпатии:
    93
    Ну, если возвращается белый экран, значит какой-то тег все таки открылся.
     
  8. despainer

    despainer

    Регистр.:
    15 фев 2008
    Сообщения:
    615
    Симпатии:
    168
    Вот смотрите:
    вот код:

    #!/usr/local/bin/php -q
    <?php
    //Служебная хрень :))
    error_reporting (E_ALL);

    /* Разрешить скрипту зависнуть в ожидании соединений. */
    set_time_limit (0);



    //Переменные для настройки сокетов
    $SOCKET_ADDR = '127.0.0.1';
    $SOcKET_PORT = '10000';
    $SERVER_VERSIONS='Wellcom CHAT SERVER Designet';
    //Создаем передаваемые заголовки (от сервера к клиенту)


    $conhtmltagsmain["htzet"] = "200 OK HTTP/1.1\r\n Connection: close\r\n Content-Type: text/html\r\n \r\n";

    //Дополнительные заголовки


    $conhtmltags["htmltags"] = "Transitional//EN\" \"http://www.w3.org/TR/REC-html40/loose.dtd\"><html><head><title>You are out!</title></head><body></body></html>";

    //Проверка



    echo 'Create socket ... ';
    if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
    throw new Exception('socket_create() failed: '.socket_strerror(socket_last_error())."\n");
    } else {
    echo "OK\n";
    }

    echo 'Bind socket ... ';
    if (($ret = socket_bind($sock, $SOCKET_ADDR, $SOcKET_PORT)) < 0) {
    throw new Exception('socket_bind() failed: '.socket_strerror(socket_last_error())."\n");
    } else {
    echo "OK\n";
    }

    echo 'Listen socket ... ';
    if (($ret = socket_listen($sock, 5)) < 0) {
    throw new Exception('socket_listen() failed: '.socket_strerror(socket_last_error())."\n");
    } else {
    echo "OK\n";
    }

    echo 'Accept socket ... ';
    if (($msgsock = socket_accept($sock)) < 0) {
    throw new Exception('socket_accept() failed: '.socket_strerror(socket_last_error())."\n");
    } else {
    echo "OK\n";
    }
    $msg = $conhtmltagsmain["htzet"];
    echo "Say to client ($msg) ... ";
    socket_write($msgsock, $msg, strlen($msg));
    echo "OK\n";
    $msg1 = $conhtmltagsmain["htmltags"];
    echo "Say to client ($msg) ... ";
    socket_write($msgsock, $msg1, strlen($msg1));
    echo "OK\n";
    <?



    При запуске скрипта и при попытке зацепится сервер выводит файл default (без расширения) и предлагает загрузить его.
    Подскажите где в коде ошибка и приведите работающий пример!

    Если цеплятся телнетом на порт 10000 то выводятся заголовки тут вроде все правильно.
    Просьба гуру дать совет и привести пример работающего кода )))
     
  9. DIAgen

    DIAgen Постоялец

    Регистр.:
    30 окт 2006
    Сообщения:
    134
    Симпатии:
    72
    Вот держи рабочий твой скриптик :)

    PHP:
    <?php

    /**
     * @author DIAgen
     * @copyright 2008
     */

    set_time_limit(0);

    $SOCKET_ADDR '127.0.0.1';
    $SOcKET_PORT '10000';
    $SERVER_VERSIONS 'Wellcom CHAT SERVER Designet';


    $conhtmltagsmain["htzet"] = "HTTP/1.1 200 OK\nContent-Type: text/html\nConnection: clos";

    $conhtmltagsmain["htmltags"] = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Wellcom CHAT SERVER Designet v.0.0.1</title>
    </head>
    <body>
    HELLO!
    </body>
    </html>'
    ;


    echo 
    'Create socket ... ';
    if ((
    $sock socket_create(AF_INETSOCK_STREAMSOL_TCP)) < 0) {
        throw new 
    Exception('socket_create() failed: ' socket_strerror(socket_last_error()) . "\n");
    } else {
        echo 
    "OK\n";
    }

    echo 
    'Bind socket ... ';
    if ((
    $ret socket_bind($sock$SOCKET_ADDR$SOcKET_PORT)) < 0) {
        throw new 
    Exception('socket_bind() failed: ' socket_strerror(socket_last_error
            
    ()) . "\n");
    } else {
        echo 
    "OK\n";
    }

    echo 
    'Listen socket ... ';
    if ((
    $ret socket_listen($sock5)) < 0) {
        throw new 
    Exception('socket_listen() failed: ' socket_strerror(socket_last_error
            
    ()) . "\n");
    } else {
        echo 
    "OK\n";
    }


    while (
    1) {

        echo 
    'Accept socket ... ';
        if ((
    $msgsock socket_accept($sock)) < 0) {
            throw new 
    Exception('socket_accept() failed: ' socket_strerror(socket_last_error
                
    ()) . "\n");
        } else {
            echo 
    "OK\n";
        }

        
    $tmp = @socket_read($msgsock1024PHP_BINARY_READ);

        
    $msg $conhtmltagsmain["htzet"] . "\n\n" $conhtmltagsmain["htmltags"];
        echo 
    "Say to client \n($msg) ... ";
        
    socket_write($msgsock$msgstrlen($msg));
        echo 
    "OK\n";


        
    socket_close($msgsock);
    }

    ?>
     
    despainer нравится это.
  10. despainer

    despainer

    Регистр.:
    15 фев 2008
    Сообщения:
    615
    Симпатии:
    168
    и еще вопрос:а теперь как тоже самое завернуть в SSL?
     
Статус темы:
Закрыта.