За последние 24 часа нас посетили 20699 программистов и 1331 робот. Сейчас ищут 719 программистов ...

on-line общение пользователей

Тема в разделе "JavaScript и AJAX", создана пользователем EvelRus, 11 мар 2009.

  1. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    Задача... сделать скрипт со следущим функционалом:

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

    Как реализовать? я понимаю, что надо отправлять через БД и проверять нет ли новых сообщений, но каждую секунду проверять.... а пользователей тысячи... и для разных юзеров - разные окна... и думаю делать не через новое окно, а через слои невидимые и менять атрибуты...

    но вопрос все же в проверке и отправке сообщений...
     
  2. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Значит не каждую секунду проверять :)
     
  3. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    но все равно это будет жутко грузить сервер
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    варианта клиент-клиент нету.

    тогда только клиент-сервер-клиент, а тут как извратиться...

    ну не раз в секунду, конечно, но раз в 30 сек нормально, но надо померять и можно клиенту возвращать след интервал, если у него к примеру канал тормозит. это же ЧАТа не ICQ?
     
  5. EvelRus

    EvelRus Активный пользователь

    С нами с:
    16 ноя 2006
    Сообщения:
    2.168
    Симпатии:
    0
    Адрес:
    Москва
    да, чат, но совсем приватный... по типу лички, но с автоматическим обновлением...

    А померить скорость - это как?
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    для чата 30 сек - в самый раз
     
  7. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Если хочется интерактива, то флеш или джава или тот же аякс для создания push канала. На сервере что-то готовое, типа jabber сервера, к примеру - тогда можно найти и готовые решения/библиотеки для клиентской стороны.
     
  8. sblblx

    sblblx Активный пользователь

    С нами с:
    10 июн 2009
    Сообщения:
    13
    Симпатии:
    0
    Доброго времени суток. Подобное есть на хостинге, хотелось бы иметь на сайте форму поддержки через icq. Все, что надо - это получение и отправка сообщений. Без доп наворотов. Я, как понимаю, могу это осуществить через жабру. Скрипт или статью на протокол не подскажите? Class.Jabber.PHP смотрел. Слишком крут. И так как я совсем начинающий, хотелось бы что нибудь попроще рассмотреть для начала.
     
  9. S.t.A.M.

    S.t.A.M. Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    1.041
    Симпатии:
    0
    Аякс + простенький скрипт (есть/нет) + оптимизированный запрос в БД.
    Делать запрос раз в 15-30 секунд...

    Не думаю, что сильно будет грузить систему...
     
  10. sblblx

    sblblx Активный пользователь

    С нами с:
    10 июн 2009
    Сообщения:
    13
    Симпатии:
    0
    В том то и дело, что хотелось бы на php и без бд. Траффик будет катастрофически маленький
     
  11. zheka_13

    zheka_13 Активный пользователь

    С нами с:
    1 май 2009
    Сообщения:
    71
    Симпатии:
    0
    я такое себе сделал на яваскрипте + flash socket + сервер на питоне..
     
  12. sblblx

    sblblx Активный пользователь

    С нами с:
    10 июн 2009
    Сообщения:
    13
    Симпатии:
    0
    кинешь примерчик? Посмотреть что как
     
  13. sblblx

    sblblx Активный пользователь

    С нами с:
    10 июн 2009
    Сообщения:
    13
    Симпатии:
    0
    По сути то нужен коннект (определение статуса не нужно-с этим думаю справлюсь) и прием-отправка
     
  14. zheka_13

    zheka_13 Активный пользователь

    С нами с:
    1 май 2009
    Сообщения:
    71
    Симпатии:
    0
    Сервер на питоне сделан на основе єтого http://www.werocom.nl/documents/python001.php.
    Работает отлично, но для флеша требуется доработка с которой я намучился из-за его безопасности...
    Код в общем то прост ... допилить под себя мне біло очень легко, плюс хотел питон выучить....
    Очень стабилен в принципе если отлавливать все ексепшоны правильно....

    ниже код самомой флехи, использовал Action Script 2 вместо 3 (меньше наворотов, более стар, более стабилен и распространен, да и того что там есть для єтих целей хватает с головой)

    Код (Text):
    1.  
    2. import flash.external.*;
    3. import XMLSocket;
    4.  
    5. var Sock = new XMLSocket();
    6. var connected=false;
    7. but.label="AS2 offline";
    8. var host="ххх.ххх.ххх.ххх";
    9. var port=843;
    10.  
    11. ExternalInterface.addCallback("connect_to_server", null, start_server);
    12. ExternalInterface.addCallback("disconnect_from_server", null, stop_server);
    13. ExternalInterface.addCallback("send_message", null, send_xml);
    14. function start_server(){
    15.      if(!connected){
    16.          if (!Sock.connect(host, port))
    17.          { 
    18.              but.label="AS2 offline";
    19.              ExternalInterface.call("get_warning", "Problem connecting to server");
    20.          }
    21.          else {
    22.              but.label="AS2 online, ok";
    23.          }
    24.      }
    25.      else{
    26.          ExternalInterface.call("get_warning", "You've already connected to server");
    27.      }
    28. }
    29. function stop_server(){
    30.         if (connected) {
    31.             Sock.close();
    32.             connected=false;
    33.             but.label="AS2 offline";
    34.             ExternalInterface.call("get_warning", "You've been disconnected from server");
    35.         }
    36.         else{
    37.             ExternalInterface.call("get_warning", "You're not connected to server");
    38.         }
    39. }
    40. function send_xml(str:String){
    41.     if (connected){
    42.         Sock.send(new XML(str));
    43.         Sock.flush();
    44.     }
    45.     else {
    46.          but.label="AS2 offline";
    47.          ExternalInterface.call("get_warning", "You're not connected to server");
    48.     }
    49. }
    50. Sock.onData=function(str){
    51.     if (str.indexOf("ERROR")>=0) ExternalInterface.call("get_warning", str)
    52.     else ExternalInterface.call("get_message", str);
    53. }
    54.  
    55. Sock.onConnect=function(success){
    56.     connected=true;
    57.     but.label="AS2 online, ok";
    58.     }
    59. Sock.onClose=function(){
    60.     connected=false;
    61.     but.label="AS2 offline";
    62.     }
    здесь but -это баттон(кнопка на флеше) с лабелем типа шоб шото показовало пока что... по идее вообще можно ее убрать тогда флеша на странице не будет вообще (видимого)

    ну и пара фунций на javascript которые с етим флешом работают
    Код (Text):
    1.  
    2. getFlashMovie("ee").send_message(str);
    3. function get_message(str) {
    4.   alert (str);
    5. }
    тут все очень кратко если чо отвечу подробнее...
     
  15. nemec

    nemec Активный пользователь

    С нами с:
    20 дек 2006
    Сообщения:
    73
    Симпатии:
    0
    Адрес:
    malnova, latgola
    И я тоже за socketи, сообжения будут приходить сразу (а не через 15 сек)

    Я использую PHP для открития портов:
    PHP:
    1. <?php
    2.  
    3. //////////////////////////////////////////////////////////
    4. class Socket
    5. {
    6.     var $master;
    7.     var $clients;
    8.     var $error;
    9.     var $users = 5;
    10.     function SocketStart($ad, $port, $usr=NULL)
    11.     {
    12.         error_reporting(E_ALL);
    13.         set_time_limit(0);
    14.         ob_implicit_flush();
    15.         $this->users = empty($usr) ? $this->users : $usr;
    16.         echo "\n\n\n";
    17.         if(!$this->master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) {
    18.             $this->display_error('create connection failed');
    19.         }
    20.         socket_set_option($this->master, SOL_SOCKET,SO_REUSEADDR, 1);
    21.         if(!socket_bind($this->master, $ad, $port)) {
    22.             $this->display_error('bind problems');
    23.         }
    24.         if(!socket_listen($this->master, $this->users)) {
    25.             $this->display_error('listen problems');
    26.         }
    27.         $this->clients = array($this->master);
    28.     }
    29.     /////////////////////////////////////////////////////////////////
    30.     function loop()
    31.     {
    32.         while(TRUE) {
    33.             $read = $this->clients;
    34.             socket_select($read, $write = NULL, $except = NULL, NULL);
    35.             foreach($read as $socket) {
    36.                 if ($socket == $this->master) {
    37.                     if (!$client = socket_accept($this->master)) {
    38.                         $this->display_error('accept');
    39.                         continue;
    40.                     } else {
    41.                         $this->add_new_connection($client);
    42.                     }
    43.                 } else {
    44.                     $bytes = socket_recv($socket, $buffer, 2048, 0);
    45.                     $income = trim($buffer);
    46.                     if ($bytes == 0) {
    47.                         $this->close_connection($socket);
    48.                     } elseif (!empty($income)) {
    49.                         $this->display_master("$income");
    50.                         $this->read_client($socket, $income);
    51.                     }
    52.                 }
    53.                
    54.             }
    55.         }
    56.     }
    57.     ////////////////////////////////////////////////////////
    58.     //user method
    59.     function read_client($client, $income)
    60.     {
    61.        
    62.     }
    63.     /////////////////////////////////////////
    64.     //add connection, and stay it online
    65.     function add_new_connection($client)
    66.     {
    67.         array_push($this->clients, $client);
    68.     }
    69.     //remove connection
    70.     function close_connection($client)
    71.     {
    72.         $index = array_search($client, $this->clients);
    73.         unset($this->clients[$index]);
    74.         socket_close($client);
    75.     }
    76.     //////////////////////////////////////////////////////////////////
    77.     //handle only one client
    78.     function handle_one($client, $buffer)
    79.     {
    80.         $sendUsers = $buffer . "\0";
    81.         socket_write($client, $sendUsers);
    82.     }
    83.     //////////////////////////////////////////////////////////////////
    84.     //handle all client with buffer, can add without clients
    85.     function handle_all($buffer, $withOut = array())
    86.     {
    87.         $allclients = $this->clients;
    88.         array_shift($allclients);
    89.         foreach($allclients as $client) {
    90.             if(!($withOut && in_array($client, $withOut))){
    91.                 $this->handle_one($client, $buffer);
    92.             }
    93.         }
    94.     }
    95.     //dispaly mes to master
    96.     function display_master($mes)
    97.     {
    98.         echo $mes . "\n";
    99.     }
    100.     //display error
    101.     function display_error($err = NULL)
    102.     {
    103.         $this->error = $err;
    104.         echo 'error: ' . $this->error . "; reason: " . socket_strerror(socket_last_error()) . "\n";
    105.     }
    106. }
    107. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    Это сырой класс и его надо расширять. Чтобы позволить flashу подсоединится, то на первый запрос надо что-то такое:
    PHP:
    1.     function read_client($client, $income)
    2.     {
    3.         if('<policy-file-request/>'==$income){
    4.             $this->handle_one($client, '<'.'?xml version="1.0" encoding="UTF-8"?'.'>'.
    5.     '<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFileSocket.xsd">'.
    6.         '<allow-access-from domain="*" to-ports="*" secure="false" />'.
    7.         '<site-control permitted-cross-domain-policies="all" />'.
    8.     '</cross-domain-policy>');
    9.             $this->remove_connection($client);
    10.         }
    11.     }
    и потом просто запускаем скрипт
    PHP:
    1. $socket->SocketStart($socketAddress, $socketPort, $default_xml, $socketReceiveBytes, $maxUsers);
    2. $socket->loop();