WebSocket,php后端如何一对一发消息和收消息

实现 WebSocket 的一对一消息通信涉及客户端和服务器端两个部分的编码。我将为你提供一个基本的示例,展示如何使用 PHP(通过 Ratchet 库)实现后端 WebSocket 服务器,以及如何在客户端设置发送者和接收者信息。

image.png

客户端(前端)部分

在客户端,通常使用 JavaScript 来实现 WebSocket 连接和消息发送。以下是一个简单的示例代码:


javascript代码:

// 客户端 WebSocket 连接

var socket = new WebSocket('ws://yourserveraddress:8080');


// 当连接打开时

socket.onopen = function() {

    console.log('WebSocket connected.');


    // 准备发送的消息

    var message = {

        sender: 'sender_id',   // 发送者的标识,可以是用户 ID 或其他标识符

        receiver: 'recipient_id',   // 接收者的标识

        content: 'Hello!'     // 消息内容

    };


    // 发送消息给服务器

    socket.send(JSON.stringify(message));

};


// 监听来自服务器的消息

socket.onmessage = function(event) {

    var receivedMessage = JSON.parse(event.data);

    console.log('Message received from server:', receivedMessage);

    // 在这里处理接收到的消息

};


// 错误处理

socket.onerror = function(error) {

    console.error('WebSocket error:', error);

};


// 连接关闭时的处理

socket.onclose = function(event) {

    if (event.wasClean) {

        console.log('WebSocket closed cleanly');

    } else {

        console.error('WebSocket connection closed unexpectedly');

    }

};

服务器端(PHP)部分

在服务器端,我们使用 PHP 和 Ratchet 库来实现 WebSocket 服务器,并处理客户端发送过来的消息。以下是一个简单的例子 server.php:


php代码:

<?php

require __DIR__ . '/vendor/autoload.php';


use Ratchet\Server\IoServer;

use Ratchet\Http\HttpServer;

use Ratchet\WebSocket\WsServer;

use Ratchet\MessageComponentInterface;

use Ratchet\ConnectionInterface;


class Chat implements MessageComponentInterface {

    protected $clients;


    public function __construct() {

        $this->clients = new \SplObjectStorage;

    }


    public function onOpen(ConnectionInterface $conn) {

        // 存储连接对象

        $this->clients->attach($conn);

        echo "New connection! ({$conn->resourceId})\n";

    }


    public function onMessage(ConnectionInterface $from, $msg) {

        $message = json_decode($msg);


        // 找到接收者并发送消息

        foreach ($this->clients as $client) {

            if ($client !== $from && $message->receiver == $client->resourceId) {

                $client->send(json_encode([

                    'sender' => $message->sender,

                    'content' => $message->content

                ]));

                break;

            }

        }

    }


    public function onClose(ConnectionInterface $conn) {

        // 移除断开的连接

        $this->clients->detach($conn);

        echo "Connection {$conn->resourceId} has disconnected\n";

    }


    public function onError(ConnectionInterface $conn, \Exception $e) {

        echo "An error has occurred: {$e->getMessage()}\n";

        $conn->close();

    }

}


// 启动 WebSocket 服务器

$server = IoServer::factory(

    new HttpServer(

        new WsServer(

            new Chat()

        )

    ),

    8080  // WebSocket 服务器端口

);


echo "WebSocket server running...\n";


$server->run();

解释

客户端部分:在客户端,通过 WebSocket 连接发送一个 JSON 格式的消息,包含发送者和接收者的标识以及消息内容。

服务器端部分:在 PHP 中,使用 Ratchet 库实现一个 WebSocket 服务器。在 onMessage 方法中,服务器接收到消息后解析 JSON 数据,查找与接收者匹配的客户端连接,并将消息发送给该客户端。

注意事项

安全性:这个示例中没有包括身份验证或安全性检查,实际应用中需要根据需求加强安全性措施。

异常处理:适当处理连接关闭、错误等异常情况,以确保服务器的稳定性和可靠性。

扩展性:此示例是基于一对一通信,如果需要支持多对多或其他复杂的通信模式,需要相应调整和扩展。

通过这些代码示例,你可以实现基本的 WebSocket 一对一消息通信功能,在实际应用中可根据具体需求进行扩展和优化。


上一篇:使用jQuery来读写cookie的代码
下一篇:PHP编程中有哪些处理字符串,数据,数组的函数方法