isidrogg / socket-bundle
Symfony MEFSocketBundle
Requires
- php: >=5.3.2
- symfony/framework-bundle: ~2.3|~3.0
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通信。我将与这个包一起使用它,您可以期待使用这两个包的好处。
现在开始用它实现一些酷炫的功能。