【问题标题】:How can I send a message to a specific client connected through socket如何向通过套接字连接的特定客户端发送消息
【发布时间】:2018-05-14 23:02:12
【问题描述】:

你好这是我第一次在套接字上工作。我有多个客户端通过特定端口连接到我的套接字服务器。我想向特定客户发送特定消息。我怎样才能做到这一点?。

我正在使用这个library

https://github.com/navarr/Sockets

这是代码

<?php

use Navarr\Socket\Socket;
use Navarr\Socket\Server;

class EchoServer extends Server
{
    const DEFAULT_PORT = 7;

    public function __construct($ip = null, $port = self::DEFAULT_PORT)
    {
        parent::__construct($ip, $port);
        $this->addHook(Server::HOOK_CONNECT, array($this, 'onConnect'));
        $this->addHook(Server::HOOK_INPUT, array($this, 'onInput'));
        $this->addHook(Server::HOOK_DISCONNECT, array($this, 'onDisconnect'));
        $this->run();
    }

    public function onConnect(Server $server, Socket $client, $message)
    {
        echo 'Connection Established',"\n";
    }

    public function onInput(Server $server, Socket $client, $message)
    {
        echo 'Received "',$message,'"',"\n";
        $client->write($message, strlen($message));
    }

    public function onDisconnect(Server $server, Socket $client, $message)
    {
        echo 'Disconnection',"\n";
    }
}

$server = new EchoServer('0.0.0.0');

如果只有一个客户端连接,这行$client-&gt;write($message, strlen($message)); 将向客户端发送一条消息。但是如果连接了多个客户端,那么如何向特定客户端发送消息?

【问题讨论】:

  • 您需要跟踪session中的用户吗?然后向他们发送相应的反馈

标签: php sockets


【解决方案1】:

在 onConnect 函数中添加此代码。

//declare this as global inside EchoServer class so that you can access this outside onConnect function
$connected_clients["userID"] = $client; //use unique id for key

然后发送消息,使用userID访问权限客户端:

$connected_clients["userID"]->write($message, strlen($message));

要获取userID,一旦客户端连接到您的服务器请求客户端ID,例如:使用JSON方便通信,发送此JSON消息

{"messageType":"request", "requestType": "identification"} 

给客户。在客户端处理消息并发送此 JSON 消息

{"messageType":"response", 
 "body":{"userID":"123456", "accessToken":"ye5473rgfygf737trfeyg3rt764e"}} 

返回服务器。在服务器端验证访问令牌并从响应中检索userIDuserID 是存储在数据库中的唯一标识号,在注册到您的聊天站点期间分配给每个用户。

要了解发送消息的客户端,请使用此 JSON 消息格式

{"messageType":"message", 
 "from":"userID", 
 "body":"message here"}

根据您的喜好进行修改。

【讨论】:

  • 您好,谢谢您的回答。我有一个问题。我怎么知道这个客户端是我正在寻找的那个客户端并将数据发送到这个特定的客户端。我的意思是在 OnConnect 函数中我正在接收资源 ID。但是如何识别用户。
  • 客户端是否必须从他的一端发送一些我必须在 onconnect 函数中获取的东西?
  • 或者相反,我会要求一个客户端发送一些特定的字符串,例如“helloworld”,然后在 onInput 函数中检查 helloworld 字符串。但是我怎样才能确定哪个用户向我发送了 hello world 文本,所以我根据它向他发送响应
  • 我已经编辑了答案以反映您知道的问题
  • 非常感谢。如果我有任何其他问题,我可以在这里再问一次关于同一主题的问题吗?
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2018-09-08
  • 2017-07-01
  • 2017-08-05
  • 2018-05-16
  • 2017-09-30
  • 1970-01-01
  • 2020-07-10
相关资源
最近更新 更多