当前位置:   article > 正文

前端js后端nginx+php+workerman实现websocket通信_workerman nginx

workerman nginx

workerman是纯PHP开发的开源PHP 应用容器,可以通过composer安装,目前因为要用到客户端与服务器实时通信,故使用了workerman中的websocket模块功能

服务器端:

1.建一个目录,创建start.php文件,文件名随意

2.composer安装workerman

composer require workerman/workerman

3.根据worker示例编写代码

简单的开发示例-workerman手册

  1. <?php
  2. use Workerman\Worker;
  3. use Workerman\Connection\TcpConnection;
  4. use Workerman\Protocols\Http\Request;
  5. require_once __DIR__ . '/vendor/autoload.php';
  6. // 创建一个Worker监听2345端口,使用websocket协议通讯
  7. // 不要把websocket写成了tcp或者http
  8. $http_worker = new Worker("websocket://0.0.0.0:6789");
  9. // 启动4个进程对外提供服务
  10. $http_worker->count = 4;
  11. $http_worker->onConnect = function(TcpConnection $connection)
  12. {
  13. echo "connected:\n";
  14. //var_dump($connection);
  15. echo "new connection from ip " . $connection->getRemoteIp() . "\n";
  16. };
  17. // 接收到浏览器发送的数据时回复hello world给浏览器
  18. $http_worker->onMessage = function(TcpConnection $connection, $data)
  19. {
  20. echo "get message:\n";
  21. var_dump($data);
  22. //var_dump($request);
  23. // 向浏览器发送hello world
  24. // Connection::send(mixed $data [,$raw = false])
  25. // 第二个参数是raw,发送的数据只是第一个参数,不要搞错了
  26. // https://www.workerman.net/doc/workerman/tcp-connection/send.html
  27. $connection->send('hello world' . $data);
  28. };
  29. $http_worker->onClose = function(TcpConnection $connection)
  30. {
  31. echo "connection closed\n";
  32. };
  33. // 运行worker
  34. Worker::runAll();

4.配置nginx

workerman默认是可以直接监听端口的,但是因为开发环境、防火墙、安全、其他项目等因素,js直接连服务器ip+端口,连不上,所以采用了nginx代理转发,server模块中添加如下location

  1. location /websocket {
  2. proxy_pass http://127.0.0.1:6789;
  3. #js前端ws = new WebSocket('wss://www.example.com/websocket');
  4. #workerman里面$http_worker = new Worker("websocket://0.0.0.0:6789");
  5. #这里就是代理转发到本地的6789端口
  6. proxy_http_version 1.1;
  7. proxy_set_header Upgrade $http_upgrade;
  8. proxy_set_header Connection "Upgrade";
  9. proxy_set_header Host $host;
  10. }

前端:

1.编写js代码

  1. // 创建 WebSocket 对象并建立连接
  2. var ws = null;
  3. try{
  4. ws = new WebSocket('wss://www.haoqi100.com/websocket');
  5. }catch(e){
  6. console.log("new socket catch", e)
  7. }
  8. console.log("get websocket:", ws)
  9. console.log("init event:")
  10. // 打开连接时触发的事件
  11. ws.onopen = function(event) {
  12. console.log('WebSocket 已连接');
  13. // onopen里面send会断开连接,应该是因为打乱了握手顺序
  14. setTimeout(()=>{
  15. ws.send('i am ok')
  16. // 发送心跳,不然时间长了会断开
  17. heartBeat()
  18. }, 1)
  19. };
  20. // 接收到消息时触发的事件
  21. ws.onmessage = function(event) {
  22. console.log('接收到服务器的消息:', event.data);
  23. };
  24. // 发生错误时触发的事件
  25. ws.onerror = function(error) {
  26. console.error('WebSocket 错误:', error);
  27. };
  28. // 关闭连接时触发的事件
  29. ws.onclose = function(event) {
  30. console.log('WebSocket 已关闭', event);
  31. ws = null
  32. };
  33. function heartBeat(){
  34. var heartInterval = setInterval(()=>{
  35. if(ws){
  36. ws.send('ping')
  37. }else{
  38. clearInterval(heartInterval)
  39. console.log("heartBeat finish")
  40. }
  41. }, 10000)
  42. }

注意事项:

1.前端js里面ws.onopen不要马上send,可能会打乱握手顺序

2.服务端的send有两个参数,第二个可选参数不会当成数据发送,不要搞错了

3.注意自己实现一个心跳,以免长时间没有收发数据导致连接断开

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/309455
推荐阅读
相关标签
  

闽ICP备14008679号