1

我想使用 PHP 和 nginx 实现一个简单的 WebSocket 服务器,我的印象如下:

  1. 一旦 Websocket 通过了RFC 6455中描述的“协议切换” ,它就可以与任何标准(非“Web”)套接字服务器进行通信。
  2. 根据nginx手册,nginx可以进行前述的“协议切换”。

考虑到这一点,我尝试了以下由 JavaScript 客户端、nginx 配置和 PHP 服务器组成的简单实现(见下文)。

结果:

  • Connection: upgradePHP 服务器接收包含,Sec-WebSocket-Key: ***和类似字段的 WebSocket HTTP 标头。我认为这很好。
  • 但是,该onopen事件永远不会在客户端上触发,这就是我卡住的地方。

问题:

  • 我是否误解了一些细节,或者可能是它如何工作的整个概念?
  • 如何使我的代码示例工作?

Javascript 客户端:

function socket() {
 
  var ws = new WebSocket("ws://socket/hello/");
  
  ws.onopen = function() {
    ws.send("Hello, World!");
  };
  
  ws.onmessage = function(event) { 
    console.log(event.data);
  };
  
}

socket();

nginx配置:

  server {
    location /hello/ {
      proxy_pass http://localhost:10000;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }   
    server_name socket;
    root socket;
  }

PHP服务器:

(完全按照PHP 手册中示例 #1 中的描述实现,仅更改$address127.0.0.1。)

4

1 回答 1

2

它可以,但前提是套接字服务器实现了 websocket 协议。如果您询问它是否可以用作通用 TCP 或 UDP 套接字,它不能。句号。

于 2013-09-14T00:01:44.577 回答