всем Доброго времени суток. Есть задача реализовать чат. хочу оценки олгаритма этого дела. 1 И так . имеем user1 который должен связыватся с userom2 . user1 шлем ajax-ом данные на сервер сервер обрабатывает(проверка и тд ) данные и пересылает их пользователю user2 в его браузер . получается 2 браузера постаянно или переодически должны быть подключенны к серверу зделаю это через ajax Правильно ли я вижу решение этой задачи? 2 И также хотелось бы реализовать чат с браузера на браузер . преположительно сервер дает ключь и ip 2 м браузерам которые средствами js и ajax будут слушать друг друга и отправлять данные . получается браузер должен уметь обрабатывать запросы к нему тобиш user1 дает запрос на ip браузера user2 отдаем ему данные. Также хотелось бы вашего мнения и подсказки какими средствами можно это реализавать. Надеюсь на мнения Гуру данного форума.
Либо веб-сокеты тебе нужны, либо лонг-пулинг. И то и то гуглится. Выбирай, что удобнее в твоем случае. Вообще минуя сервер? Как рация, клиент<->клиент?
Если требования к вашему чату позволяют его реализовать ajax-запросами, то это допустимое решение. Браузер это клиентское приложение и функции веб-сервера в требуемом вам ключе он выполнять не умеет. Для этого нужно искать/писать расширение.
Нет сервер нужен лиш для установки соединия , гуглю 2 день думал и о готовых решениях , но хочется самому попробывать реализовать и написать код . ajax так как иных способов реализаций я незнаю, но хотелось бы реализовать это гибким способом,(бизапастность тоже важна) нужно оптимальное простое решение без использования больших библиотек которые нужно еще отдельно изучать просматривать. Добавлено спустя 9 минут 37 секунд: long polling - интерестная штука . а если чат будит расширен до видио-звонков то для них можно использовать voip? а сам чат и передача фаилов будут на long polling ? 500-1000 парных чатов сможет он обработать ?
нашел вот такой вот код Код (Text): <?php function go(){ $starttime = round(microtime(true),2); echo "GO() ... <br />\r\n"; echo "socket_create ..."; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if($socket < 0){ echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n"; exit(); } else { echo "OK <br />\r\n"; } echo "socket_bind ..."; $bind = socket_bind($socket, '127.0.0.1', 889);//привязываем его к указанным ip и порту if($bind < 0){ echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n"; exit(); }else{ echo "OK <br />\r\n"; } socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);//разрешаем использовать один порт для нескольких соединений echo "Listening socket... "; $listen = socket_listen($socket, 5);//слушаем сокет if($listen < 0){ echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n"; exit(); }else{ echo "OK <br />\r\n"; } while(true){ //Бесконечный цикл ожидания подключений echo "Waiting... "; $accept = @socket_accept($socket); //Зависаем пока не получим ответа if($accept === false){ echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n"; usleep(100); } else { echo "OK <br />\r\n"; echo "Client \"".$accept."\" has connected<br />\r\n"; } $msg = "Hello, Client!"; echo "Send to client \"".$msg."\"... "; socket_write($accept, $msg); echo "OK <br />\r\n"; if( ( round(microtime(true),2) - $starttime) > 100) { echo "time = ".(round(microtime(true),2) - $starttime); echo "return <br />\r\n"; return $socket; } } } error_reporting(E_ALL); //Выводим все ошибки и предупреждения set_time_limit(0); //Время выполнения скрипта не ограничено ob_implicit_flush(); //Включаем вывод без буферизации $socket = go(); //Функция с бесконечным циклом, возвращает $socket по запросу выполненному по прошествии 100 секнуд. echo "go() ended<br />\r\n"; if (isset($socket)){ echo "Closing connection... "; @socket_shutdown($socket); socket_close($socket); echo "OK <br />\r\n"; } странно работает. через раз ошибки код js Код (Text): "use strict"; //All my JavaScript written in Strict Mode http://ecma262-5.com/ELS5_HTML.htm#Annex_C (function () { // ======== private vars ======== var socket; //////////////////////////////////////////////////////////////////////////// var init = function () { socket = new WebSocket(document.getElementById("sock-addr").value); socket.onopen = connectionOpen; socket.onmessage = messageReceived; //socket.onerror = errorOccurred; //socket.onopen = connectionClosed; document.getElementById("sock-send-butt").onclick = function () { socket.send(document.getElementById("sock-msg").value); }; document.getElementById("sock-disc-butt").onclick = function () { connectionClose(); }; document.getElementById("sock-recon-butt").onclick = function () { socket = new WebSocket(document.getElementById("sock-addr").value); socket.onopen = connectionOpen; socket.onmessage = messageReceived; }; }; function connectionOpen() { socket.send("Connection with \""+document.getElementById("sock-addr").value+"\" Подключение установлено обоюдно, отлично!"); } function messageReceived(e) { console.log("Ответ сервера: " + e.data); document.getElementById("sock-info").innerHTML += (e.data+"<br />"); } function connectionClose() { socket.close(); document.getElementById("sock-info").innerHTML += "Соединение закрыто <br />"; } return { //////////////////////////////////////////////////////////////////////////// // ---- onload event ---- load : function () { window.addEventListener('load', function () { init(); }, false); } } })().load(); ну и html код Код (Text): <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title>Siple Web-Socket Client</title> </head> <body> <br /><br /> <script src="socket.js" type="text/javascript"></script> Server address: <input id="sock-addr" type="text" value="ws://127.0.0.1:8000"><br /> Message: <input id="sock-msg" type="text"> <input id="sock-send-butt" type="button" value="send"> <br /> <br /> <input id="sock-recon-butt" type="button" value="reconnect"><input id="sock-disc-butt" type="button" value="disconnect"> <br /> <br /> Полученные сообщения от веб-сокета: <div id="sock-info" style="border: 1px solid"> </div> </body> </html>
Я так понимаю это серверная часть вебсокета, клиентская часть вебсокета и пример страницы, которая использует это? А что за ошибки выдает через раз?
WebRTC тоже посмотрел завтра займусь тестом. если кто смотрел знает работал думаю многие будут рады правильным сылкам ну или описания тут как поставить например на openserver для тестов Добавлено спустя 1 минуту 57 секунд: совершенно верно! ошибки.... Код (Text): GO() ... socket_create ...OK socket_bind ... Warning: socket_bind(): in D:\open\OpenServer\domains\livechat.loc\simpleworking.php on line 18 OK Listening socket... Warning: socket_listen(): in D:\open\OpenServer\domains\livechat.loc\simpleworking.php on line 29 OK Waiting... Error: ������� ������������ ��������. Send to client "Hello, Client!"... Warning: socket_write() expects parameter 1 to be resource, boolean given in D:\open\OpenServer\domains\livechat.loc\simpleworking.php on line 51 OK Waiting... Error: ������� ������������ ��������. Send to client "Hello, Client!"... Warning: socket_write() expects parameter 1 to be resource, boolean given in D:\open\OpenServer\domains\livechat.loc\simpleworking.php on line 51 OK Waiting... Error: ������� ������������ ��������. Send to client "Hello, Client!"... Warning: socket_write() expects parameter 1 to be resource, boolean given in D:\open\OpenServer\domains\livechat.loc\simpleworking.php on line 51 OK там разные порты в файлах менял порты
У тебя по какой-то причине $accept===false. Наверное, потому что в течении 100 секунд ты не послал в сокет никаких данных? Других причин не вижу. Да, тему интересную поднял и дело годное делаешь, щас, по грабелькам постучаться немного лбом, и норм, заработает, оно всегда так Добавлено спустя 1 минуту 20 секунд: А вообще, когда ты что-то шлешь, или когда сервер что-то шлет, сообщение проходит? Если так, ошибки данные можно игнорировать, они, так сказать, "профилактические".
нет тут просто это сервер он отдает сообшение обратно. позже буду дописывать и зделаю полностью чат. все делаю одинакого. вы тестировали у вас возникоют подобные ошибки?
Нет, тестов не проводил. И, сегодня, уже не представится. Завтра после работы, постараюсь, самому интересно.