Задача... сделать скрипт со следущим функционалом: возле ника юзера картинка чата, при нажатии на него открывается окно для ввода сообщения, юзер отправляет, а у пользователя на другом конце оно открывается с текстом и соответственно он может ответить.. по типу аси ) Как реализовать? я понимаю, что надо отправлять через БД и проверять нет ли новых сообщений, но каждую секунду проверять.... а пользователей тысячи... и для разных юзеров - разные окна... и думаю делать не через новое окно, а через слои невидимые и менять атрибуты... но вопрос все же в проверке и отправке сообщений...
варианта клиент-клиент нету. тогда только клиент-сервер-клиент, а тут как извратиться... ну не раз в секунду, конечно, но раз в 30 сек нормально, но надо померять и можно клиенту возвращать след интервал, если у него к примеру канал тормозит. это же ЧАТа не ICQ?
да, чат, но совсем приватный... по типу лички, но с автоматическим обновлением... А померить скорость - это как?
Если хочется интерактива, то флеш или джава или тот же аякс для создания push канала. На сервере что-то готовое, типа jabber сервера, к примеру - тогда можно найти и готовые решения/библиотеки для клиентской стороны.
Доброго времени суток. Подобное есть на хостинге, хотелось бы иметь на сайте форму поддержки через icq. Все, что надо - это получение и отправка сообщений. Без доп наворотов. Я, как понимаю, могу это осуществить через жабру. Скрипт или статью на протокол не подскажите? Class.Jabber.PHP смотрел. Слишком крут. И так как я совсем начинающий, хотелось бы что нибудь попроще рассмотреть для начала.
Аякс + простенький скрипт (есть/нет) + оптимизированный запрос в БД. Делать запрос раз в 15-30 секунд... Не думаю, что сильно будет грузить систему...
Сервер на питоне сделан на основе єтого http://www.werocom.nl/documents/python001.php. Работает отлично, но для флеша требуется доработка с которой я намучился из-за его безопасности... Код в общем то прост ... допилить под себя мне біло очень легко, плюс хотел питон выучить.... Очень стабилен в принципе если отлавливать все ексепшоны правильно.... ниже код самомой флехи, использовал Action Script 2 вместо 3 (меньше наворотов, более стар, более стабилен и распространен, да и того что там есть для єтих целей хватает с головой) Код (Text): import flash.external.*; import XMLSocket; var Sock = new XMLSocket(); var connected=false; but.label="AS2 offline"; var host="ххх.ххх.ххх.ххх"; var port=843; ExternalInterface.addCallback("connect_to_server", null, start_server); ExternalInterface.addCallback("disconnect_from_server", null, stop_server); ExternalInterface.addCallback("send_message", null, send_xml); function start_server(){ if(!connected){ if (!Sock.connect(host, port)) { but.label="AS2 offline"; ExternalInterface.call("get_warning", "Problem connecting to server"); } else { but.label="AS2 online, ok"; } } else{ ExternalInterface.call("get_warning", "You've already connected to server"); } } function stop_server(){ if (connected) { Sock.close(); connected=false; but.label="AS2 offline"; ExternalInterface.call("get_warning", "You've been disconnected from server"); } else{ ExternalInterface.call("get_warning", "You're not connected to server"); } } function send_xml(str:String){ if (connected){ Sock.send(new XML(str)); Sock.flush(); } else { but.label="AS2 offline"; ExternalInterface.call("get_warning", "You're not connected to server"); } } Sock.onData=function(str){ if (str.indexOf("ERROR")>=0) ExternalInterface.call("get_warning", str) else ExternalInterface.call("get_message", str); } Sock.onConnect=function(success){ connected=true; but.label="AS2 online, ok"; } Sock.onClose=function(){ connected=false; but.label="AS2 offline"; } здесь but -это баттон(кнопка на флеше) с лабелем типа шоб шото показовало пока что... по идее вообще можно ее убрать тогда флеша на странице не будет вообще (видимого) ну и пара фунций на javascript которые с етим флешом работают Код (Text): getFlashMovie("ee").send_message(str); function get_message(str) { alert (str); } тут все очень кратко если чо отвечу подробнее...
И я тоже за socketи, сообжения будут приходить сразу (а не через 15 сек) Я использую PHP для открития портов: PHP: <?php ////////////////////////////////////////////////////////// class Socket { var $master; var $clients; var $error; var $users = 5; function SocketStart($ad, $port, $usr=NULL) { error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); $this->users = empty($usr) ? $this->users : $usr; echo "\n\n\n"; if(!$this->master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) { $this->display_error('create connection failed'); } socket_set_option($this->master, SOL_SOCKET,SO_REUSEADDR, 1); if(!socket_bind($this->master, $ad, $port)) { $this->display_error('bind problems'); } if(!socket_listen($this->master, $this->users)) { $this->display_error('listen problems'); } $this->clients = array($this->master); } ///////////////////////////////////////////////////////////////// function loop() { while(TRUE) { $read = $this->clients; socket_select($read, $write = NULL, $except = NULL, NULL); foreach($read as $socket) { if ($socket == $this->master) { if (!$client = socket_accept($this->master)) { $this->display_error('accept'); continue; } else { $this->add_new_connection($client); } } else { $bytes = socket_recv($socket, $buffer, 2048, 0); $income = trim($buffer); if ($bytes == 0) { $this->close_connection($socket); } elseif (!empty($income)) { $this->display_master("$income"); $this->read_client($socket, $income); } } } } } //////////////////////////////////////////////////////// //user method function read_client($client, $income) { } ///////////////////////////////////////// //add connection, and stay it online function add_new_connection($client) { array_push($this->clients, $client); } //remove connection function close_connection($client) { $index = array_search($client, $this->clients); unset($this->clients[$index]); socket_close($client); } ////////////////////////////////////////////////////////////////// //handle only one client function handle_one($client, $buffer) { $sendUsers = $buffer . "\0"; socket_write($client, $sendUsers); } ////////////////////////////////////////////////////////////////// //handle all client with buffer, can add without clients function handle_all($buffer, $withOut = array()) { $allclients = $this->clients; array_shift($allclients); foreach($allclients as $client) { if(!($withOut && in_array($client, $withOut))){ $this->handle_one($client, $buffer); } } } //dispaly mes to master function display_master($mes) { echo $mes . "\n"; } //display error function display_error($err = NULL) { $this->error = $err; echo 'error: ' . $this->error . "; reason: " . socket_strerror(socket_last_error()) . "\n"; } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Это сырой класс и его надо расширять. Чтобы позволить flashу подсоединится, то на первый запрос надо что-то такое: PHP: function read_client($client, $income) { if('<policy-file-request/>'==$income){ $this->handle_one($client, '<'.'?xml version="1.0" encoding="UTF-8"?'.'>'. '<cross-domain-policy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.adobe.com/xml/schemas/PolicyFileSocket.xsd">'. '<allow-access-from domain="*" to-ports="*" secure="false" />'. '<site-control permitted-cross-domain-policies="all" />'. '</cross-domain-policy>'); $this->remove_connection($client); } } и потом просто запускаем скрипт PHP: $socket->SocketStart($socketAddress, $socketPort, $default_xml, $socketReceiveBytes, $maxUsers); $socket->loop();