frosty22 / ratchet
Nette IO服务器的Ratchet库
Requires
- php: >= 5.3.9
- cboden/ratchet: 0.3.*
- nette/nette: 2.*
This package is not auto-updated.
Last update: 2020-01-05 17:16:04 UTC
README
在Nette中实现Ratchet WebSocket服务器 http://socketo.me。
特性
- 实现了Ratchet所需组件,并大部分在Nette风格下进行了封装
- 提供容器服务,并允许通过配置文件设置服务器
- 简化Nette应用程序和Ratchet服务器之间的服务、参数、容器通信
- 通信封装在Presenter风格中,但包含自带的Application - 请参见下文Application, Control
- 通过路由映射客户端 > 服务器消息 - 请参见下文Router
- 服务器 > 客户端消息可以通过多种方式处理 - 请参见下文Responses
扩展安装
- 通过Composer下载: frosty22/ratchet
- 连接DI扩展 Ale\Ratchet\DI\RatchetExtension
如果您不知道如何连接扩展,建议使用扩展 https://github.com/vojtech-dobes/nette-extensions-list,它允许您在配置文件中定义“extensions”部分,然后可以轻松添加此扩展。作为替代方案,您需要在boostrap中在Configuration的事件onCompile上挂载回调,该回调将使用Compiler的addExtension方法添加所有您的扩展。
响应
可以通过多种方式向客户端发送服务器消息 - 在您的Controller中,有几个send()方法。这些方法作为发送Response的快捷方式,用于向特定客户端发送。您可以通过实现接口 IResponse 并扩展JS处理器来编写自己的response。
响应在客户端库 jquery.ratchet.js 中如何捕获和处理上略有不同。
MessageResponse
这是可以发送的基本response - 这是一个纯plaintext response,如果使用附带的 jquery.ratchet.js,您需要在客户端自己处理,示例在此
class TestControl extends \Ale\Ratchet\UI\Control { public function handleSimple() { $this->send(new \Ale\Ratchet\Response\MessageResponse('pouze plain text')); } }
// Vytvoření spojení var ws = $.websocket("ws://127.0.0.1:8080/", { message : function(data, event) { // Přidání callbacku na všechny zprávy alert(data); // V příkladu vyhodí hlášku "pouze plain text" } }); // Callback po vytvoření spojení se socket servrem ws.bind("open", function(){ // Odešleme zprávu na náš TestControl a handleSimple (bez parametrů) ws.send("Test:simple"); });
CallResponse
这是一个更复杂的response,它传递一个要在客户端调用的回调函数名,数据以JSON格式传递,并在PHP和JS端进行转换。
class TestControl extends \Ale\Ratchet\UI\Control { public function handleDefault($abc) { // $abc - bude obsahovat "test123" dle příkladu JS níže $this->send(new \Ale\Ratchet\Response\CallResponse('foo', array('bar' => 'baz'))); } }
// Objekt obsahující naše oblužné callbacky (určeno pro CallResponse) var sampleObject = new Object(); // Definujeme callback na property 'foo' // bude zavolán dle příkladu výše v handleDefault, a vyhodí hlášku "baz" sampleObject.foo = function(data) { alert(data.bar); }; // Vytvoření spojení var ws = $.websocket("ws://127.0.0.1:8080/", { handler : sampleObject // Předáme handler našemu klientovi }); // Callback po vytvoření spojení se socket servrem ws.bind("open", function(){ // Odešleme zprávu na náš TestControl a handleDefault ws.send("Test:default", { 'abc' : 'test123' }); });
Application
Router & Request
用于将接收到的消息转换为特定的 Request,这是一个包含有关要调用哪个controller、其方法和哪些参数的对象的信息的对象。
Router 是一个对象,它从客户端接收的消息创建此 Request,并将其传递给 Application,该 Application 将处理此过程 - 创建相应的controler、调用指定的方法并传递 Request 中的参数。
Router 必须包含一个 match 方法,该方法接收一个字符串格式的消息并返回一个Request对象。
SimpleRouter
默认路由器是SimpleRouter,它接收JSON格式的消息,包含两个键 path 和 data。其中,path包含到controller的路径,格式类似于在Nette Presenters中创建链接,即 Module:Controller:handle,其中module是可选的,默认的handle或controller在默认状态下命名为 default。