2

websockets 是否可以实现以下操作:

  • 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);
?>

我不知道 send_websocket_data 函数的实现是什么样的,除了它需要一个用户名和一些数据来发送。

4

1 回答 1

1

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

然后实现取决于您的客户端和服务器。

由于您似乎喜欢 php,因此您可以查看Ratchet。我没有尝试过。

您还可以阅读有关websockets的信息

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

Websocket 很酷!祝你好运 :)

于 2013-04-24T15:35:50.163 回答