frosty22/ratchet

Nette IO服务器的Ratchet库

dev-master 2014-10-21 12:38 UTC

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

扩展安装

  1. 通过Composer下载: frosty22/ratchet
  2. 连接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格式的消息,包含两个键 pathdata。其中,path包含到controller的路径,格式类似于在Nette Presenters中创建链接,即 Module:Controller:handle,其中module是可选的,默认的handle或controller在默认状态下命名为 default

服务器

控制

连接