Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите чат демоном, непонятны некоторые моменты 
:(
    Опции темы
vintyara
Дата 3.7.2007, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 24.3.2005
Где: Ode$$a

Репутация: 1
Всего: 2



Субж. Написал такой кодик:

Код

<?php
if ($socket = socket_create (AF_INET, SOCK_STREAM, SOL_TCP))
   echo "Started";
else
  echo "Error";

socket_bind($socket, "vint.od.ua", 666);
socket_listen ($socket);

while (true) {

    if (socket_accept ($socket))
    {
        $greeting_message = "Welcom to vint.od.ua chat server (test mode)";
        socket_write ($socket, $greeting_message, strlen($greeting_message));
        echo "Someone connected \n";

    /*    while (true)
        {
                $incoming_message = socket_read ($connector, 2048);
                if ($incoming_message != '') {
                    echo $incoming_message;
                    $incoming_message = '';
                }
            sleep (1);
        }
    */
    }
}



Один коннект принимает. Не понимаю как он будет принимать второй коннект на себя (если будет. если не будет, то как сделать чтобы "был" ? smile ) И так же не могу понять - как я могу, скажем, что-то послать только _одному_ юзеру из двух законекченных ?
PM MAIL ICQ   Вверх
sTa1kEr
Дата 3.7.2007, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Цитата(vintyara @  3.7.2007,  09:32 Найти цитируемый пост)
Один коннект принимает. Не понимаю как он будет принимать второй коннект на себя (если будет. если не будет, то как сделать чтобы "был" ?

Принимать второй коннект так же через socket_accept() и добавлять затем в массив, а для отправки/получения данных сразу всем клиентам использовать stream_select(). Почитай комментарии о функциях socket_* и stream_socket_*, в частности этот http://ru2.php.net/manual/ru/function.stre...erver.php#44501 . Если интересно, то вечером напишу поподробней с примерами.
PM MAIL   Вверх
vintyara
Дата 3.7.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 24.3.2005
Где: Ode$$a

Репутация: 1
Всего: 2



sTa1kEr, спасибо ! зацепка есть smile ! 
Примеры никода не помешают - пость сюда, если не трудно smile !

Это сообщение отредактировал(а) vintyara - 3.7.2007, 12:28
PM MAIL ICQ   Вверх
vintyara
Дата 4.7.2007, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 24.3.2005
Где: Ode$$a

Репутация: 1
Всего: 2



sTa1kEr, де пример твой smile ? smile  smile  smile 
PM MAIL ICQ   Вверх
sTa1kEr
Дата 4.7.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Сейчас выложу. Только такой вопрос, как вы хотите реализовать клиентскую часть? С постоянным соединением?
PM MAIL   Вверх
vintyara
Дата 4.7.2007, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 24.3.2005
Где: Ode$$a

Репутация: 1
Всего: 2



sTa1kEr, об этом ещё не думал. На вскидку - наверное с постоянным.
PM MAIL ICQ   Вверх
sTa1kEr
Дата 4.7.2007, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 56
Всего: 146



Хм... по другому поставим вопрос. Вы хотите сделать чат через браузер? Если да, то реализовать постоянное соединение будет очень проблематично, да и не понятно зачем вообще тогда создавать чат демона?
Пример взял из комментариев на php.net, чуть-чуть переделал и добавил комментарии.
Код

$master = array();

// Начинаем прослушку порта
$socket = stream_socket_server("tcp://127.0.0.1:8000", $errno, $errstr);
if (!$socket)
{
   echo "$errstr ($errno)\n";
}
else
{
   $master[] = $socket; // Массив всех сокетов, втч и серверного
   while (true)
   {
      $read = $master;
      
      // Выбираем сокеты доступные для чтения
      $mod_fd = stream_select($read, $_w = NULL, $_e = NULL, 5);
      if ($mod_fd === FALSE)
      {
         break;
      }
      for ($i = 0; $i < $mod_fd; ++$i)
      {
         if ($read[$i] === $socket)
         {
            // Если это сам сервер, значит новый коннект
            // шлем приветствие и добавляем в массив сокет
            $conn = stream_socket_accept($socket);
            fwrite($conn, "Hello! The time is ".date("n/j/Y g:i a")."\n");
            $master[] = $conn;
         }
         else
         {
            // Если не сервер, значит какой-то клиент прислал данные
            $sock_data = fread($read[$i], 1024);
            if (strlen($sock_data) === 0)
            {
               // ...
               $key_to_del = array_search($read[$i], $master, TRUE);
               fclose($read[$i]);
               unset($master[$key_to_del]);
            }
            else if ($sock_data === FALSE)
            {
               // Какая-то ошибка
               echo "Something bad happened";
               $key_to_del = array_search($read[$i], $master, TRUE);
               unset($master[$key_to_del]);
            }
            else
            {
               // Выдаем сообщение клиента и шлем его ему обратно для проверки
               echo "Client send: $msg\n";
               fwrite($read[$i], "Client send: $msg\n");
               
               // Далее не ясно какая будет логика у клиентской части
               // и нужен ли нам еще этот коннект или нет...
               fclose($read[$i]);
               unset($master[array_search($read[$i], $master)]);
            }
         }
      }
   }
}

PM MAIL   Вверх
vintyara
Дата 4.7.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 24.3.2005
Где: Ode$$a

Репутация: 1
Всего: 2



sTa1kEr, это будет через браузер. Чат демон - для повышения знаний smile Потому как мне и чат то в принципе нафег нинада smile

За пример спасибо, буду фтыкать !
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1133 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.