向任意客户端发送websocket数据(基于用户名等)

向任意客户端发送websocket数据(基于用户名等),websocket,Websocket,WebSocket是否可以执行以下操作: UserA和UserB是站点的用户 UserA登录到站点并启动websocket连接 UserB有一条针对UserA的消息,因此他们提交一个表单,该表单由服务器上的某个脚本处理(不管是通过WS、XHR还是一个普通表单) 服务器通过websocket连接将消息发送给UserA,而不需要服务器代码,只需不断检查数据库中的新消息 理想情况下,处理消息发送的脚本将完成所有工作—将消息放入数据库并将其发送到收件人的websocket连接 编辑:以下是我对此类功

WebSocket是否可以执行以下操作:

  • UserA和UserB是站点的用户
  • UserA登录到站点并启动websocket连接
  • UserB有一条针对UserA的消息,因此他们提交一个表单,该表单由服务器上的某个脚本处理(不管是通过WS、XHR还是一个普通表单)
  • 服务器通过websocket连接将消息发送给UserA,而不需要服务器代码,只需不断检查数据库中的新消息
理想情况下,处理消息发送的脚本将完成所有工作—将消息放入数据库并将其发送到收件人的websocket连接

编辑:以下是我对此类功能的实际设想:

我正在开发一个国际象棋网站,该网站目前使用长轮询来更新对手移动时的用户,以及其他一些东西,如棋盘下方的聊天盒

以下是用户调用以进行移动的PHP脚本,并添加了代码(接近末尾)以说明我要做的事情:

/xhr/move.php

<?php
require_once "base.php";
require_once "Data.php";
require_once "php/livechess/LiveGame.php";
require_once "php/init.php";

$result=false;

if($session->user->signedin()) {
    $q=Data::unserialise($_GET["q"]);

    if(isset($q["gid"]) && isset($q["fs"]) && isset($q["ts"])) {
        $colour=Db::cell("
            select colour from seats
            where user='{$session->user->username}'
            and gid='{$q["gid"]}'
            and type='".SEAT_TYPE_PLAYER."'
        ");

        if($colour!==false) {
            $promote_to=QUEEN;

            if(isset($q["promote_to"])) {
                $promote_to=$q["promote_to"];
            }

            $game=new LiveGame($q["gid"]);

            if($game->position->active===$colour) {
                if($game->move($q["fs"], $q["ts"], $promote_to)->success) {
                    $result=$game->history->main_line->last_move->mtime;
                    $game->check_premoves();
                    $game->save();

                    /*
                    here is where the functionality I'm talking to would come in:

                    (some pseudocode for brevity)
                    */

                    $opponent_username=Db::cell("select user from seats where colour=".opp_colour($colour)." and etc");

                    send_websocket_data($opponent_username, Data::serialise($game->history->main_line->last_move));
                }
            }
        }
    }
}

echo Data::serialise($result);
?>

是websocket安装与连接的客户端的全双工连接。因此,服务器可以随时向他们发送消息

然后,实现取决于您的客户机和服务器

因为您似乎喜欢php,所以可以研究它。不过我没有试过

你也可以读到

还要记住,WebSocket不会在任何地方都工作,这主要取决于网络代理。因此,例如,您可能必须处理长轮询的优雅降级。这就是异步框架所提供的,但在其他语言中(atmosphere/java、Socket.oi/node.js)


WebSocket很酷!Goog luck:)

是的websocket安装了一个与连接的客户端的全双工连接。因此,服务器可以随时向他们发送消息

然后,实现取决于您的客户机和服务器

因为您似乎喜欢php,所以可以研究它。不过我没有试过

你也可以读到

还要记住,WebSocket不会在任何地方都工作,这主要取决于网络代理。因此,例如,您可能必须处理长轮询的优雅降级。这就是异步框架所提供的,但在其他语言中(atmosphere/java、Socket.oi/node.js)


WebSocket很酷!祝你好运:)

只要有足够的时间、金钱和程序员资源,任何事情都是可能的。你有一个更具体的问题吗?我基本上没有回答,因为我不确定WebSocket是否有我误解的基本内容,我将编辑这个问题以添加更多细节。只要有足够的时间、金钱和程序员资源,任何事情都是可能的。你有更具体的问题吗?我只是简单地说了一下,因为我不确定WebSocket是否有我误解的基本内容,我将编辑这个问题以添加更多细节。谢谢,查看Ratchet,答案在“连接”下的文档中。我知道服务器可以随时发送消息,但我仍然在考虑为每个连接运行一个服务器代码实例,比如标准HTTP,连接之间没有明显的通信方式。我需要了解的是,您的代码也处理连接的打开和关闭,并且(至少使用Ratchet)整个服务器都有一个服务器代码实例。谢谢,查看Ratchet,答案在connections下的文档中。我知道服务器可以随时发送消息,但我仍然在考虑为每个连接运行一个服务器代码实例,比如标准HTTP,连接之间没有明显的通信方式。我需要了解的是,您的代码也处理连接的打开和关闭,并且(至少使用Ratchet)整个服务器都有一个服务器代码实例。