WebSocket 可以连接到 Socket 服务器吗?

Posted

技术标签:

【中文标题】WebSocket 可以连接到 Socket 服务器吗?【英文标题】:Can a WebSocket be connected to a Socket Server? 【发布时间】:2013-09-13 16:59:36 【问题描述】:

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

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

考虑到这一点,我尝试了以下简单的实现,其中包括一个 javascript 客户端、一个 nginx 配置和一个 PHP 服务器(见下文)。

结果:

PHP 服务器接收包含Connection: upgradeSec-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 manual 中示例#1 中的描述实现,仅将$address 更改为127.0.0.1。)

【问题讨论】:

【参考方案1】:

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

【讨论】:

有没有可能做一个只需要几百行代码的简单实现(比如过时的code.google.com/p/phpwebsocket)?或者您是否不可避免地要以数千行结尾(例如socketo.me)? 这是一个复杂的标准。取决于您构建的底层系统有多复杂。要在现有的 Web 服务器之上构建它,可能有数百个。从头开始?是的,成千上万。还有很多 RFC 可供阅读。 见鬼去吧。我会使用图书馆。

以上是关于WebSocket 可以连接到 Socket 服务器吗?的主要内容,如果未能解决你的问题,请参考以下文章

无法从android okhttp3连接到节点websocket

Socket.IO-Client-Swift 未连接到 nodejs socket.io 服务器

如何使用 python 连接到 socket.io

mac上怎么连接到socket

无法使用 ssl 和 apache 连接到 websocket

WebSocket 连接到“ws://.../socket.io/”失败:WebSocket 握手期间出错:net::ERR_CONNECTION_RESET