За последние 24 часа нас посетили 22429 программистов и 1025 роботов. Сейчас ищут 683 программиста ...

Чат с ip на ip

Тема в разделе "Решения, алгоритмы", создана пользователем amir_Mirov, 30 мар 2015.

  1. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    всем Доброго времени суток.
    Есть задача реализовать чат. хочу оценки олгаритма этого дела.
    1
    И так . имеем user1 который должен связыватся с userom2 . user1 шлем ajax-ом данные на сервер
    сервер обрабатывает(проверка и тд ) данные и пересылает их пользователю user2 в его браузер .
    получается 2 браузера постаянно или переодически должны быть подключенны к серверу зделаю это через ajax Правильно ли я вижу решение этой задачи?

    2
    И также хотелось бы реализовать чат с браузера на браузер . преположительно сервер дает ключь и ip
    2 м браузерам которые средствами js и ajax будут слушать друг друга и отправлять данные .
    получается браузер должен уметь обрабатывать запросы к нему тобиш user1 дает запрос на ip браузера
    user2 отдаем ему данные. Также хотелось бы вашего мнения и подсказки какими средствами можно это реализавать.

    Надеюсь на мнения Гуру данного форума.
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Либо веб-сокеты тебе нужны, либо лонг-пулинг. И то и то гуглится. Выбирай, что удобнее в твоем случае.
    Вообще минуя сервер? Как рация, клиент<->клиент?
     
  3. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Если требования к вашему чату позволяют его реализовать ajax-запросами, то это допустимое решение.
    Браузер это клиентское приложение и функции веб-сервера в требуемом вам ключе он выполнять не умеет. Для этого нужно искать/писать расширение.
     
  4. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    Нет сервер нужен лиш для установки соединия , гуглю 2 день думал и о готовых решениях , но хочется самому попробывать реализовать и написать код .
    ajax так как иных способов реализаций я незнаю, но хотелось бы реализовать это гибким способом,(бизапастность тоже важна)
    нужно оптимальное простое решение без использования больших библиотек которые нужно еще отдельно изучать просматривать.

    Добавлено спустя 9 минут 37 секунд:
    long polling - интерестная штука . а если чат будит расширен до видио-звонков то для них можно использовать voip? а сам чат и передача фаилов будут на long polling ? 500-1000 парных чатов сможет он обработать ?
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    От сервера зависит. По сути это эмуляция сокетов. Есть и честные сокеты уже давно в браузерах.
     
  6. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    webrtc, RTMFP
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Круто! Не знал, что есть такая игрушка :)
     
  8. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    нашел вот такой вот код
    Код (Text):
    1.  
    2. <?php
    3. function go(){
    4.     $starttime = round(microtime(true),2);
    5.     echo "GO() ... <br />\r\n";
    6.  
    7.     echo "socket_create ...";
    8.     $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    9.  
    10.     if($socket < 0){
    11.         echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
    12.         exit();
    13.     } else {
    14.         echo "OK <br />\r\n";
    15.     }
    16.    
    17.  
    18.     echo "socket_bind ...";
    19.     $bind = socket_bind($socket, '127.0.0.1', 889);//привязываем его к указанным ip и порту
    20.     if($bind < 0){
    21.         echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
    22.         exit();
    23.     }else{
    24.         echo "OK <br />\r\n";
    25.     }  
    26.    
    27.     socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);//разрешаем использовать один порт для нескольких соединений
    28.  
    29.     echo "Listening socket... ";
    30.     $listen = socket_listen($socket, 5);//слушаем сокет
    31.  
    32.     if($listen < 0){
    33.         echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
    34.         exit();
    35.     }else{
    36.         echo "OK <br />\r\n";
    37.     }
    38.  
    39.     while(true){ //Бесконечный цикл ожидания подключений
    40.         echo "Waiting... ";
    41.         $accept = @socket_accept($socket); //Зависаем пока не получим ответа
    42.         if($accept === false){
    43.             echo "Error: ".socket_strerror(socket_last_error())."<br />\r\n";
    44.             usleep(100);
    45.         } else {
    46.             echo "OK <br />\r\n";
    47.             echo "Client \"".$accept."\" has connected<br />\r\n";
    48.         }
    49.  
    50.         $msg = "Hello, Client!";
    51.         echo "Send to client \"".$msg."\"... ";
    52.         socket_write($accept, $msg);
    53.         echo "OK <br />\r\n";
    54.        
    55.         if( ( round(microtime(true),2) - $starttime) > 100) {
    56.             echo "time = ".(round(microtime(true),2) - $starttime);
    57.             echo "return <br />\r\n";
    58.             return $socket;
    59.         }
    60.  
    61.  
    62.     }
    63.  
    64.  
    65. }
    66.  
    67. error_reporting(E_ALL); //Выводим все ошибки и предупреждения
    68. set_time_limit(0);      //Время выполнения скрипта не ограничено
    69. ob_implicit_flush();    //Включаем вывод без буферизации
    70.  
    71. $socket = go();         //Функция с бесконечным циклом, возвращает $socket по запросу выполненному по прошествии 100 секнуд.
    72.  
    73. echo "go() ended<br />\r\n";
    74.  
    75. if (isset($socket)){
    76.     echo "Closing connection... ";
    77.     @socket_shutdown($socket);
    78.     socket_close($socket);
    79.     echo "OK <br />\r\n";
    80. }
    странно работает. через раз ошибки
    код js
    Код (Text):
    1.  
    2. "use strict"; //All my JavaScript written in Strict Mode http://ecma262-5.com/ELS5_HTML.htm#Annex_C
    3.  
    4. (function () {
    5.     // ======== private vars ========
    6.     var socket;
    7.  
    8.     ////////////////////////////////////////////////////////////////////////////
    9.     var init = function () {
    10.        
    11.         socket = new WebSocket(document.getElementById("sock-addr").value);
    12.  
    13.         socket.onopen = connectionOpen;
    14.         socket.onmessage = messageReceived;
    15.         //socket.onerror = errorOccurred;
    16.         //socket.onopen = connectionClosed;
    17.  
    18.         document.getElementById("sock-send-butt").onclick = function () {
    19.             socket.send(document.getElementById("sock-msg").value);
    20.         };
    21.  
    22.  
    23.         document.getElementById("sock-disc-butt").onclick = function () {
    24.             connectionClose();
    25.         };
    26.  
    27.         document.getElementById("sock-recon-butt").onclick = function () {
    28.             socket = new WebSocket(document.getElementById("sock-addr").value);
    29.             socket.onopen = connectionOpen;
    30.             socket.onmessage = messageReceived;
    31.         };
    32.  
    33.     };
    34.  
    35.  
    36.     function connectionOpen() {
    37.        socket.send("Connection with \""+document.getElementById("sock-addr").value+"\" Подключение установлено обоюдно, отлично!");
    38.     }
    39.  
    40.     function messageReceived(e) {
    41.    
    42.         console.log("Ответ сервера: " + e.data);
    43.         document.getElementById("sock-info").innerHTML += (e.data+"<br />");
    44.        
    45.     }
    46.  
    47.     function connectionClose() {
    48.         socket.close();
    49.         document.getElementById("sock-info").innerHTML += "Соединение закрыто <br />";
    50.  
    51.     }
    52.  
    53.  
    54.     return {
    55.         ////////////////////////////////////////////////////////////////////////////
    56.         // ---- onload event ----
    57.         load : function () {
    58.             window.addEventListener('load', function () {
    59.                 init();
    60.             }, false);
    61.         }
    62.     }
    63. })().load();
    ну и html код
    Код (Text):
    1.  
    2. <!DOCTYPE html>
    3. <html>
    4. <head>
    5.     <meta charset="UTF-8" />
    6.     <title>Siple Web-Socket Client</title>
    7. </head>
    8. <body>
    9. <br /><br />
    10.  
    11. <script src="socket.js" type="text/javascript"></script>
    12.  
    13. Server address:
    14. <input id="sock-addr" type="text" value="ws://127.0.0.1:8000"><br />
    15. Message:
    16. <input id="sock-msg" type="text">
    17.  
    18. <input id="sock-send-butt" type="button" value="send">
    19. <br />
    20. <br />
    21. <input id="sock-recon-butt" type="button" value="reconnect"><input id="sock-disc-butt" type="button" value="disconnect">
    22. <br />
    23. <br />
    24.  
    25. Полученные сообщения от веб-сокета:
    26. <div id="sock-info" style="border: 1px solid"> </div>
    27.  
    28. </body>
    29. </html>
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Я так понимаю это серверная часть вебсокета, клиентская часть вебсокета и пример страницы, которая использует это?
    А что за ошибки выдает через раз?
     
  10. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    WebRTC тоже посмотрел завтра займусь тестом. если кто смотрел знает работал думаю многие будут рады правильным сылкам ну или описания тут как поставить например на openserver для тестов

    Добавлено спустя 1 минуту 57 секунд:
    совершенно верно!
    ошибки....
    Код (Text):
    1.  
    2. GO() ...
    3. socket_create ...OK
    4. socket_bind ...
    5. Warning: socket_bind(): in D:\open\OpenServer\domains\livechat.loc\simpleworking.php on line 18
    6. OK
    7. Listening socket...
    8. Warning: socket_listen(): in D:\open\OpenServer\domains\livechat.loc\simpleworking.php on line 29
    9. OK
    10. Waiting... Error: ������� ������������ ��������.
    11. Send to client "Hello, Client!"...
    12. Warning: socket_write() expects parameter 1 to be resource, boolean given in D:\open\OpenServer\domains\livechat.loc\simpleworking.php on line 51
    13. OK
    14. Waiting... Error: ������� ������������ ��������.
    15. Send to client "Hello, Client!"...
    16. Warning: socket_write() expects parameter 1 to be resource, boolean given in D:\open\OpenServer\domains\livechat.loc\simpleworking.php on line 51
    17. OK
    18. Waiting... Error: ������� ������������ ��������.
    19. Send to client "Hello, Client!"...
    20. Warning: socket_write() expects parameter 1 to be resource, boolean given in D:\open\OpenServer\domains\livechat.loc\simpleworking.php on line 51
    21. OK
    там разные порты в файлах менял порты
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    У тебя по какой-то причине $accept===false. Наверное, потому что в течении 100 секунд ты не послал в сокет никаких данных? Других причин не вижу.

    Да, тему интересную поднял и дело годное делаешь, щас, по грабелькам постучаться немного лбом, и норм, заработает, оно всегда так :)

    Добавлено спустя 1 минуту 20 секунд:
    А вообще, когда ты что-то шлешь, или когда сервер что-то шлет, сообщение проходит? Если так, ошибки данные можно игнорировать, они, так сказать, "профилактические".
     
  12. amir_Mirov

    amir_Mirov Новичок

    С нами с:
    25 сен 2014
    Сообщения:
    90
    Симпатии:
    0
    нет тут просто это сервер он отдает сообшение обратно.
    позже буду дописывать и зделаю полностью чат.
    все делаю одинакого. вы тестировали у вас возникоют подобные ошибки?
     
  13. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Нет, тестов не проводил. И, сегодня, уже не представится. Завтра после работы, постараюсь, самому интересно.