使用JavaScript的即时消息系统

时间:2014-12-19 10:41:09

标签: javascript php ajax sockets

我有一个学校项目,我需要创建一个基于Web的即时消息系统。

我调查了PHP套接字来完成此任务PHP socket manual

从这些我开始看到一个模式。众所周知,PHP只能运行一次(从上到下),从这些示例中我可以看到while循环是套接字监听新连接的原因。 (意味着php script永不停止)这些例子回显套接字的输出。

据我所知,如果你只是想要一个普通网站,那就太棒了。

但事实并非如此。我想使用JavaScript来构建这个应用程序,以“询问”套接字是否有任何新消息,然后是否相应地呈现消息。

由于我对PHP套接字非常新,我不确定这是否应该完全由PHP完成,或者是否可以使用JavaScript来监听套接字(通过Ajax),然后将输出打印为JSON

4 个答案:

答案 0 :(得分:0)

我建议您使用第三方库(好了,再推荐一下这个库:cboden/ratchet)。阅读其教程,您将更清楚地了解如何使用 WebSocket 协议在浏览器和服务器之间进行通信。

服务器完全可以用纯PHP实现!

答案 1 :(得分:0)

通常,对于基于推送的通知,您需要的协议(仅适用于较新的浏览器)是WebSockets。

有各种各样的图书馆和服务可以为您做到这一点:

Pusher是一种在线服务,可以与各种语言集成,为您提供实时功能。 https://pusher.com/

仅限JavaScript,如果您有节点,则应查看socket.io:http://socket.io/

在.NET领域,有一个很棒的http://signalr.net/

的SignalR

答案 2 :(得分:0)

不仅可以使用PHP,而且Thruway也很简单。 Thruway是WAMPv2 PHP客户端/路由器,它使用Ratchet进行Websocket传输。 WAMP为您提供Sub / Pub和RPC over WebSockets。

您需要创建一个简单的php路由器并从命令行启动它。像这样:

<?php
require 'vendor\autoload.php';
use Thruway\Peer\Router;
use Thruway\Transport\RatchetTransportProvider;

$router = new Router();
$transportProvider = new RatchetTransportProvider("127.0.0.1", 9090);
$router->addTransportProvider($transportProvider);

然后在客户端上,使用AutobahnJS或如果您使用角度,则可以使用angular-wamp

如果您仍有疑问,我会做一个简单的聊天示例。

答案 3 :(得分:0)

我实际上使用了基于PHP的websocket并对其进行了调整。如果你愿意,我可以双向工作。您可以将发送到websocket的消息存储在Array中,甚至可以将它们保存到数据库中。客户可以要求新消息:

看看这段代码:

    function createConnectionToWebSocket(connection)
    {
        var host = "ws://[ip of server]:9000/echobot"; // SET THIS TO YOUR SERVER --> 9000 is the port used by websockets.
        try {
                socket = new WebSocket(host);
                console.log('WebSocket - status '+socket.readyState);
                socket.onopen    = function(msg) { 
                                       console.log("Welcome - status "+this.readyState);

                                   };
                socket.onmessage = function(msg) { 
                                       messageHandlerSocket(msg.data);
                                   };
                socket.onclose   = function(msg) { 
                                       console.log("Disconnected - status "+this.readyState); 
                                       if (msg && !msg.wasClean && msg.code == 1006)
                                       {

                                       }
                                   };
                socket.onerror   = function(msg) { 

                                   };                       
            }
            catch(ex){ 
                console.log(ex); 
            }


    }

    function messageHandlerSocket(msg)
    {
        //all messages will be send in JSON
        var msg = JSON.parse(msg)
        //received JSON and check the type. Type is message
        switch (msg.type)
        {
            case "messages" :
                //code when the webserver sends back the messages.                                      

            break;
        }
   }


   socket.send(JSON.stringify({"type" : "retrievemessages", "user" : user.id}));

Socket.send允许您将数据发送到PHP服务器。我发送JSON并在服务器上解析它。基于type参数,我让PHP服务器将数据发送回相应的用户。

我扩展了Github上找到的这个网络服务器。

通过bat文件运行Web服务器。

@ECHO OFF
ECHO STARTING WEBSERVER
ECHO USING [dir to php dir]\php\php.exe
@ECHO OFF

START "WEBSOCKET" /wait /B "[dir to php dir]\php\v5.6\php.exe" -f [path to your websocket.php]