isidrogg/socket-bundle

Symfony MEFSocketBundle

安装: 45

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 3

类型:symfony-bundle

dev-master 2016-11-28 12:19 UTC

This package is not auto-updated.

Last update: 2024-10-03 09:26:10 UTC


README

在您的symfony应用程序中实现WebSocket。

文档

参考文档网站

安装

您需要 安装composer 并安装,如果您还没有安装的话。如果您还没有 symfony,可以通过composer命令行工具下载它,别犹豫了,您能做到的。现在,转到您的symfony应用程序根目录,并修改composer.json文件。在“require”部分添加以下内容

"isidrogg/socket-bundle": "dev-master"

一切就绪后,运行您的composer命令并更新您的应用程序。

php composer.phar update

这应该为您完成大部分脏活累活,包括注册命名空间和确保依赖项。剩下要做的就是将Bundle注入到AppKernel中并设置配置。

打开您的app/AppKernel.php文件,并添加下面的最后一行。

$bundles = array(
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        new Symfony\Bundle\SecurityBundle\SecurityBundle(),
        new Symfony\Bundle\TwigBundle\TwigBundle(),
        ...
        new MEF\SocketBundle\MEFSocketBundle()
        );

配置

以下是一个示例配置

mef_socket:
    port: 4000
    host: 127.0.0.1

您也可以通过在配置中指定每个来并行运行tcp和ws

mef_socket:
    tcp:
        port: 4000
        host: 127.0.0.1
    web:
        port: 4001
        host: 127.0.0.1    

TCP Socket使用

安装后,您应该测试以确保控制台命令现在可用

app/console list | grep socket

您应该看到socket:listen和socket:web:listen的命令,如果没有,那么bundle没有正确安装。

接下来,让我们测试基本的TCP socket服务器,以确保可以启动并绑定端口。

app/console socket:listen

如果成功了,您应该看到一条消息,说明“尝试连接到(主机)上的端口(端口)”。

现在让我们尝试与您刚刚启动的服务器通信。打开另一个终端shell,并使用telnet。我将使用配置部分中提到的值作为此示例的值,这样我就不必使用变量表示法。

telnet 127.0.0.1 4000

如果与socket服务器连接一切顺利,那么您应该看到这个

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

如果您看到了这个,那么您就像flynn一样!如果没有,那么,您做了什么?!您搞砸了iT!!!请再次检查配置中的主机和端口,确保服务器正在运行。运行服务器基本上是执行一个挂起的进程,它必须这样做,因为它正在监听连接,所以运行app/console socket:listen后,不要关闭该进程!!它需要保持存活,不要按Ctrl C!

好吧,既然一切顺利,现在您可以发送消息给它,比如hello,您对计算机还能说什么?停止所有下载?您应该能够查看日志并看到传入的流量,但它不会回复您……还没呢。

如果一切都很顺利,那么您就可以进行下一步了,调试和更多测试。

app/console socket:listen --debug

调试标志会在socket服务器上放置监听器,并将几乎所有活动输出到控制台屏幕。它会截断长消息,但hello当然可以。另一个基本标志是--test-mode。

app/console socket:listen --debug --test-mode

测试模式将接收一些精选词汇并对其做出回应。精选词汇是"hello"和"thanks",当与计算机说话时,请记住保持文明。使用telnet尝试它并确保您可以看到响应。

TCP Socket测试

使用--debug和--test-mode,调试将帮助您了解出了什么问题,而--test-mode是绝对必要的,所以别忘了它。在一个shell中启动服务器,在另一个shell中执行phpunit测试。我试图让phpunit在单独的进程中启动服务器,但它就是不好好配合,它太快了,端口绑定,一切都变得疯狂,所以需要两个shell。

我使用了phpunit分组来限制测试,因为不能一次性运行所有测试,这样根本无法工作,除非我能够使两个服务器并行运行,这并不难,我只需更细致地工作配置选项。

在其中一个shell中运行此命令

app/console socket:listen --debug --test-mode

在另一个shell中运行此命令

phpunit -c vendor/MEF --group="socketclient"

希望您能看到一排绿色的好成绩,一切都会顺利。

WebSocket使用

现在让我们进入重点,TCP对于玩一些底层的东西很有趣,也许是一些服务器之间的通信,但我们真正追求的是RIA的圣杯,推送技术。有了它,我们不再需要等待客户端的请求来提供更新信息。通过流式WebSocket,浏览器能够从服务器接收事件。例如,当一位用户更改记录时,另一位用户正在查看该记录,现在查看用户会收到数据更新的状态,因为服务器上触发了记录已更改的事件,并将其推送给用户。

让我们开始吧,使用以下命令启动WebSocket服务器

app/console socket:web:listen

适用于TCP套接字的相同标志也适用于WebSocket,所以--debug和--test-mode是你的新好朋友。要测试WebSocket服务器,你不能使用telnet,因为WebSocket协议非常复杂,你几乎不可能通过键盘输入来模拟它。

使用phpunit测试WebSocket

首先,以全功能测试模式启动服务器

app/console socket:web:listen --debug --test-mode

我建议使用phpunit启动,然后您可以使用浏览器进行测试。

phpunit -c vendors/MEF --group="websocket"

使用浏览器测试WebSocket

如果一切顺利,您可以使用浏览器进行测试,所以打开Chrome或Firefox,如果您认为会使用IE,请找到您漫长旅程的短码头。

var socket = WebSocket("ws://127.0.0.1:4000");

socket.onmessage = function(evt){ console.log("Socket Message received %o", evt); };

socket.send("hello");

如果一切正常,您应该从服务器收到“你好啊”的响应,您可以考虑您的WebSocket服务器已启动并运行。

现在,我将不客气地宣传我的另一个项目TrafficJS。这是一个与Backbone.js耦合的javascript库,用于优雅的事件驱动方式处理XmlHttpRequest和WebSocket通信。我将与这个包一起使用它,您可以期待使用这两个包的好处。

现在开始用它实现一些酷炫的功能。