- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是网络套接字编程的新手。我正在 codeigniter 中实现 web socket 以实现简单的聊天功能,我的配置看起来像这样
$config['ratchet_client'] = array(
'host' => '127.0.0.1', // Default host
'port' => 8282, // Default port (be careful to set unused server port)
'auth' => true, // If authentication is mandatory
'debug' => true // Better to set as false in Production
);
现在,当我在终端上启动服务器时,它显示
Running server on host 127.0.0.1:8282
Authentication activated
但是当我加载我的 html 时,它会在终端上显示以下内容
New client connected as (81)
Client (81) authentication failure
Client (81) authentication success
Client (81) disconnected
一次所有四行,在我的控制台上,我收到以下消息
<?php
defined('BASEPATH') or exit('No direct script access allowed');
// Namespaces
use Ratchet\Http\HttpServer;
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\ConnectionInterface;
use Ratchet\MessageComponentInterface;
/**
* @package CodeIgniter Ratchet WebSocket Library: Main class
* @category Libraries
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
* @license http://opensource.org/licenses/MIT > MIT License
* @link https://github.com/romainrg
*
* CodeIgniter library who allow you to make powerful applications with realtime interactions by using Websocket technology and Ratchetphp
*/
class Ratchet_client
{
/**
* CI Super Instance
* @var array
*/
private $CI;
/**
* Default host var
* @var string
*/
public $host = null;
/**
* Default host var
* @var string
*/
public $port = null;
/**
* Default auth var
* @var bool
*/
public $auth = false;
/**
* Default debug var
* @var bool
*/
public $debug = false;
/**
* Auth callback information
* @var array
*/
public $callback = array();
/**
* Config vars
* @var array
*/
protected $config = array();
/**
* Define allowed callbacks
* @var array
*/
protected $callback_type = array('auth', 'event');
/**
* Class Constructor
* @method __construct
* @param array $config Configuration
* @return void
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
*/
public function __construct(array $config = array())
{
// Load the CI instance
$this->CI = &get_instance();
// Load the class helper
$this->CI->load->helper('ratchet_client');
// Define the config vars
$this->config = (!empty($config)) ? $config : array();
// Config file verification
if (empty($this->config)) {
output('fatal', 'The configuration file does not exist');
}
// Assign HOST value to class var
$this->host = (!empty($this->config['ratchet_client']['host'])) ? $this->config['ratchet_client']['host'] : '';
// Assign PORT value to class var
$this->port = (!empty($this->config['ratchet_client']['port'])) ? $this->config['ratchet_client']['port'] : '';
// Assign AUTH value to class var
//$this->auth = (!empty($this->config['ratchet_client']['auth'] && $this->config['ratchet_client']['auth'])) ? true : false;
// Assign DEBUG value to class var
$this->debug = (!empty($this->config['ratchet_client']['debug'] && $this->config['ratchet_client']['debug'])) ? true : false;
}
/**
* Launch the server
* @method run
* @return string
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
*/
public function run()
{
// Initiliaze all the necessary class
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Server()
)
),
$this->port,
$this->host
);
// Run the socket connection !
$server->run();
}
/**
* Define a callback to use auth or event callback
* @method set_callback
* @param array $callback
* @return void
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
*/
public function set_callback($type = null, array $callback = array())
{
// Check if we have an authorized callback given
if (!empty($type) && in_array($type, $this->callback_type)) {
// Verify if the method does really exists
if (is_callable($callback)) {
// Register callback as class var
$this->callback[$type] = $callback;
} else {
output('fatal', 'Method ' . $callback[1] . ' is not defined');
}
}
}
}
/**
* @package CodeIgniter Ratchet WebSocket Library: Server class
* @category Libraries
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
* @license http://opensource.org/licenses/MIT > MIT License
* @link https://github.com/romainrg
*
* CodeIgniter library who allow you to make powerfull applications with realtime interactions by using Websocket technology and Ratchetphp
*/
class Server implements MessageComponentInterface
{
/**
* List of connected clients
* @var array
*/
protected $clients;
/**
* List of subscribers (associative array)
* @var array
*/
protected $subscribers = array();
/**
* Class constructor
* @method __construct
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
*/
public function __construct()
{
// Load the CI instance
$this->CI = &get_instance();
// Initialize object as SplObjectStorage (see PHP doc)
$this->clients = new SplObjectStorage;
// // Check if auth is required
if ($this->CI->ratchet_client->auth && empty($this->CI->ratchet_client->callback['auth'])) {
output('fatal', 'Authentication callback is required, you must set it before run server, aborting..');
}
// Output
if ($this->CI->ratchet_client->debug) {
output('success', 'Running server on host ' . $this->CI->ratchet_client->host . ':' . $this->CI->ratchet_client->port);
}
// Output
if (!empty($this->CI->ratchet_client->callback['auth']) && $this->CI->ratchet_client->debug) {
output('success', 'Authentication activated');
}
}
/**
* Event trigerred on new client event connection
* @method onOpen
* @param ConnectionInterface $connection
* @return string
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
*/
public function onOpen(ConnectionInterface $connection)
{
// Add client to global clients object
$this->clients->attach($connection);
// Output
if ($this->CI->ratchet_client->debug) {
output('info', 'New client connected as (' . $connection->resourceId . ')');
}
}
/**
* Event trigerred on new message sent from client
* @method onMessage
* @param ConnectionInterface $client
* @param string $message
* @return string
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
*/
public function onMessage(ConnectionInterface $client, $message)
{
// Broadcast var
$broadcast = false;
// Check if received var is json format
if (valid_json($message)) {
// If true, we have to decode it
$datas = json_decode($message);
}
// Once we decoded it, we check look for global broadcast
$broadcast = (!empty($datas->broadcast) and $datas->broadcast == true) ? true : false;
// Count real clients numbers (-1 for server)
$clients = count($this->clients) - 1;
// Here we have to reassign the client ressource ID, this will allow us to send message to specified client.
if (!empty($datas->user_id) && $datas->user_id !== $client->resourceId) {
// At this moment we have to check if we have authent callback defined
if (!empty($this->CI->ratchet_client->callback['auth']) && empty($client->subscriber_id)) {
// Call user personnal callback
$auth = call_user_func_array($this->CI->ratchet_client->callback['auth'], array($datas));
// Verify authentication
if (empty($auth) or !is_integer($auth)) {
output('error', 'Client (' . $client->resourceId . ') authentication failure');
// Closing client connexion with error code "CLOSE_ABNORMAL"
$client->close(1006);
}
// Add UID to associative array of subscribers
$client->subscriber_id = $auth;
// Output
if ($this->CI->ratchet_client->debug) {
output('success', 'Client (' . $client->resourceId . ') authentication success');
}
}
}
// Now this is the management of messages destinations, at this moment, 4 possibilities :
// 1 - Message is not an array OR message has no destination (broadcast to everybody except us)
// 2 - Message is an array and have destination (broadcast to single user)
// 3 - Message is an array and don't have specified destination (broadcast to everybody except us)
// 4 - Message is an array and we want to broadcast to ourselves too (broadcast to everybody)
if (!empty($message)) {
// We look around all clients
foreach ($this->clients as $user) {
// Broadcast to single user
if (!empty($datas->recipient_id)) {
if ($user->subscriber_id == $datas->recipient_id) {
$this->send_message($user, $message, $client);
break;
}
} else {
// Broadcast to everybody
if ($broadcast) {
$this->send_message($user, $message, $client);
} else {
// Broadcast to everybody except us
if ($client !== $user) {
$this->send_message($user, $message, $client);
}
}
}
}
}
}
/**
* Event triggered when connection is closed (or user disconnected)
* @method onClose
* @param ConnectionInterface $connection
* @return string
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
*/
public function onClose(ConnectionInterface $connection)
{
// Output
if ($this->CI->ratchet_client->debug) {
output('info', 'Client (' . $connection->resourceId . ') disconnected');
}
// Detach client from SplObjectStorage
$this->clients->detach($connection);
}
/**
* Event trigerred when error occured
* @method onError
* @param ConnectionInterface $connection
* @param Exception $e
* @return string
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
*/
public function onError(ConnectionInterface $connection, \Exception $e)
{
// Output
if ($this->CI->ratchet_client->debug) {
output('fatal', 'An error has occurred: ' . $e->getMessage());
}
// We close this connection
$connection->close();
}
/**
* Function to send the message
* @method send_message
* @param array $user User to send
* @param array $message Message
* @param array $client Sender
* @return string
* @author Romain GALLIEN <romaingallien.rg@gmail.com>
*/
protected function send_message($user = array(), $message = array(), $client = array())
{
// Send the message
$user->send($message);
// We have to check if event callback must be called
if (!empty($this->CI->ratchet_client->callback['event'])) {
// At this moment we have to check if we have authent callback defined
call_user_func_array($this->CI->ratchet_client->callback['event'], array((valid_json($message) ? json_decode($message) : $message)));
// Output
if ($this->CI->ratchet_client->debug) {
output('info', 'Callback event "' . $this->CI->ratchet_client->callback['event'][1] . '" called');
}
}
// Output
if ($this->CI->ratchet_client->debug) {
output('info', 'Client (' . $client->resourceId . ') send \'' . $message . '\' to (' . $user->resourceId . ')');
}
}
}
最佳答案
这是一个非常愚蠢的错误,因为我正在检查if (empty($auth) or !is_integer($auth))
我的 is_integer($auth)
失败了所以我添加了 $auth=(int)$auth;
在我的 if 语句和问题解决之前......
关于php - Ratchet 客户端身份验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67045173/
我需要一起实时收听 2 个网络套接字 URL。我创建了 2 个连接到不同 URL 的连接,但我只看到了第一条消息结果。如何在没有关闭第一次连接的情况下从 wss://exalpme2 获取消息? 我的
我正在尝试根据 YouTube 中的教程创建基本的 websocket 聊天,但在运行时我在终端中遇到了这个错误 php bin/server.php Fatal error: Interface '
我正在尝试在 Ratchet 中使用 sessionProvider,以下是我的 shell 脚本: namespace App\Console\Commands; use Ratchet\S
我正在尝试在我的系统上设置 Ratchet 并关注了 socketo.me 我已经做了一切,直到安装 ZMQ 和 React/Zmq 并且一切都成功了。 但是当我尝试运行时 push-server.p
我正在为我的应用程序使用 PHP Ratchet(推送集成),并具有实时出价功能,它的工作原理非常棒。 由于高流量,我们将我们的应用程序移到 AWS 平台上,我们有多个应用程序服务器实例,其中一个(R
我正在使用 Ratchet 为群聊启用推送通知。 我决定做以下事情: 每当用户连接时,为他订阅他参与的所有群组主题以及个人消息主题。 我有一个数组 protected $subscribedTopic
我只是在学习 Ratchet(用于 PHP 实时聊天应用程序的库)。根据文档,以下函数将收到两件事: 消息来自谁和 信息。 然而,它错过了发送给谁。此功能将消息发送给所有连接的人。但我也想实现一对一聊
我使用 Ratchet php 创建了一个网络套接字连接。我连接了一个客户端,然后执行了一个查询(执行查询大约需要 20 秒),同时我尝试连接另一个客户端,我看到网络套接字连接处于挂起状态(仍在尝试切
我正在开发一个具有聊天功能的网站,当用户收到新消息时需要即时通知。我正在尝试决定是使用 Ratchet 服务器还是使用 AJAX 实现长轮询系统。我目前已经实现了一个基本的 Pub/Sub Ratch
我正在尝试使 Ratchet 推送教程起作用。 http://socketo.me/docs/push 我正在按照教程所说的做,但我的订阅者不会收到任何消息。 我的服务器.php getSocket(
我开始使用 PhP Ratchet 套接字。按照指南,我可以制作一个简单的聊天应用程序,它可以在同一台计算机上运行。例如,如果我打开chrome和firefox,我可以交互发送和接收消息,ok。 问题
我是尝试实现 Ratchet 的编程初学者。 这是我当前的文件结构 D:\Xampp composer.phar htdocs Ratchet composer.
在 documentation , 他们有: Item 2 问:这只是打字错误,还是他们出于某种原因将 table-view-cell 放入了两次? 最佳答案 前几天我注意到了同样的事情并打算调查..
我是网络套接字编程的新手。我正在 codeigniter 中实现 web socket 以实现简单的聊天功能,我的配置看起来像这样 $config['ratchet_client'] = array
最近一直在学习如何使用 Ratchet 在 PHP 中实现 websockets,但我不知道如何让它与按钮点击一起工作。 这是我当前的 JS/jQuery 代码: jQuery(documen
我有一个托管在 AZURE 平台上的 Ubuntu 服务器。 SSH 的 IP 是 52.XX.XX.XX,如果我这样做了 ifconfig 表明 eth0 Link encap:Ethernet
我目前正在为 UI 使用 Ratchet 框架,并且想知道如何在页面之间共享信息(例如用户输入的数据)。该网站似乎没有涵盖这一点,我似乎无法找到任何类型的教程。 最佳答案 您最好的选择是使用 HTML
我已经使用 Ratchet 集成了 pusher。向所有用户广播工作正常。 现在我试图找到一种方法,当我连接到特定用户时如何向特定用户发送消息。 在 subscribe 上执行的方法: public
在客户端: var ws = new WebSocket('ws://localhost:8082/chat?id=123&tid=7'); 在服务器端 class MyApp implements
我使用 Ratchet 作为一些基于浏览器的游戏的套接字服务器,我注意到一个非常奇怪的行为。 我的应用程序类实现了 WampServerInterface,我注意到在 4-5 个客户端连接和断开连接(
我是一名优秀的程序员,十分优秀!