当前位置: 首页 > 知识库问答 >
问题:

棘轮没有从浏览器接收WebSocket数据包?

计胤
2023-03-14

我试图通过使用棘轮来测试简单的WebSockets乒乓响应。我的WebSocket服务器看不到来自web浏览器的WebSocket客户端的任何响应,但浏览器可以很好地看到WebSocket服务器发送的数据包。我在找原因。

我目前的猜测是:

  • 缺少一些HTTP标头
  • 我必须在浏览器上对数据包进行编码wsclient.send(encodeFrame(“{'action':'pong'}”));
  • CloudFlare无法将WS流中的数据包识别为有效数据包,并将其处理
  • EC2实例中的CloudFlare或nginx正在进行一些奇怪的缓冲
  • 棘轮无法识别最低IOServer级别上的数据包,并将其击穿
    • 但是我从来没有从这个级别得到任何错误或异常
    • Linux服务器@Amazon EC2
    • DNS@CloudFlare在
    • 上使用免费计划和加速+强制HTTPS重定向
    • HTTP服务器是nginx
    • nginx上没有HTTPS(Cloudflare重定向HTTPS->EC2 HTTP)
    • WebSocket服务器(棘轮)在EC2
    • 127.0.0.1:65000运行
    • Nginx将/API重定向到127.0.0.1:65000(棘轮)
      null

    直接连接到CloudFlare的缓存IP提供的主机。socket连接到wss://host/api。连接再次出现在Ratchet上的应用程序实现级别(onopen)。我的浏览器可以看到ping数据包,所以从Ratchet发送数据包可以正常工作。

    但是,然后我尝试从浏览器向ping发送pong应答,并且onmessage方法不会在Ratched的任何级别上触发。连接保持打开,如果我使用Fiddler观察,则会不断发送pings和pongs,但WebSocket服务器从不接收这些pongs(onmessage)。

    Fiddler的WebSocket流显示,来自浏览器的pongs有“通过key: 屏蔽的数据”,但来自Ratched的ping没有被屏蔽。

    页面加载:

    本地计算机http://host/→CloudFlare HTTPS重定向HTTPS://host/→http://host-with-amazon-public-ip/→http://host-with-amazon-nat-ip/→将wss WebSocket连接加载到/API的HTML+JS页面

    /API的WebSocket连接:

    CloudFlare HTTPS重定向wss://host/api→http://host-with-amazon-public-ip/api→http://host-with-amazon-nat-ip/api→本地服务器nginx重定向/api→127.0.0.1:65000→连接升级→WebSocket流→web浏览器的WebSocket流

    server {
      listen 80;
    
      server_name test.example.com;
      root /home/raspi/test/public;
      autoindex off;
      index index.php;
    
      access_log /home/raspi/test/http-access.log;
      error_log /home/raspi/test/http-error.log notice;
    
      location / { 
        index index.php; 
        try_files $uri $uri/ /index.php?$args;
      }
    
     location /api {
        access_log /home/raspi/test/api-access.log;
        error_log /home/raspi/test/api-error.log;
    
        expires epoch;
    
        proxy_ignore_client_abort on;
        proxy_buffering off;
        proxy_request_buffering off;
        proxy_cache off;
        proxy_pass http://127.0.0.1:65000/;
    
        proxy_http_version 1.1;
    
        proxy_set_header Host $host;
        proxy_set_header Connection "keep-alive, Upgrade";
        proxy_set_header Upgrade "websocket";
        proxy_set_header Accept-Encoding "gzip, deflate";
        proxy_set_header Sec-WebSocket-Extensions "permessage-deflate";
        proxy_set_header Sec-WebSocket-Protocol "game";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
    
      location ^~ /js/app/ {
        try_files $uri /;
        expires epoch;
        add_header Cache-Control "no-cache" always;
      }
    
      location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ {
        try_files $uri /;
        access_log off;
        expires max;
      }
    
      location = /robots.txt  { access_log off; log_not_found off; }
      location = /favicon.ico { access_log off; log_not_found off; }    
      location ~ /\. { access_log off; log_not_found off; deny all; }
    
      location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$; 
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock; 
        fastcgi_index index.php; 
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
        include fastcgi_params; 
      }
    }
    

共有1个答案

乐正迪
2023-03-14

Web套接字目前仅在业务和企业级可用。你说过你在免费计划中。这就是问题所在。

 类似资料:
  • 我读过这篇stackoverflow帖子。不幸的是,我的PAAS支持不使用httpd.conf。他们建议我直接在。htaccess中添加ProxyPass。 关于在httpd.conf文件中添加以下一行,在这里我要告知,我们在服务器上没有使用httpd,因为服务器是基于Debian的,我们使用的是Apache web服务器。我相信您可以在htaccess文件中使用相同的代码行,或者如果您可以咨询开

  • 问题内容: 我有一个棘手的聊天服务器文件 我使用Websocket进行连接,效果很好 我想要安全连接,因此我尝试使用SSL连接,但无法正常工作。 我的问题是 如何将Websocket与SSL连接连接 任何的想法? 问题答案: 如果您使用的是Apache Web服务器(2.4或更高版本),请在httpd.conf文件中启用以下模块: mod_proxy.so mod_proxy_wstunnel.s

  • 我有一个Angular 4和Java/Spring MVC/Jhipster网站,我正试图使用本教程创建一个websocket(使用sock js和stomp.js)。我可以连接到websocket,但是当我尝试从Java代码向客户端发送数据时,什么也没有发生。请帮帮我。 下面,我只是试图访问我的浏览器中的http://localhost:9001/api/websocket/testSend,并

  • 到“ws://example.app:8080/”的WebSocket连接失败:在收到握手响应之前连接已关闭

  • 问题内容: 为了澄清当我询问浏览器到浏览器的通信时,我的意思是在转发消息之间没有服务器。我想为游戏实现这样的功能。如果无法在websockets中使用p2p,是否有类似的选择?任何帮助表示赞赏。 问题答案: 否。浏览器只能启动WebSockets连接,不能接收它们。在W3C的浏览器API规范只定义了如何启动出站连接。 您可以创建一个既可以启动也可以接受WebSockets连接的应用程序,但是浏览器