Socket.io 无法在 Chrome 和 Firefox 上向 Node 服务器发送消息

Posted

技术标签:

【中文标题】Socket.io 无法在 Chrome 和 Firefox 上向 Node 服务器发送消息【英文标题】:Socket.io fails to emit messages to Node server on Chrome & Firefox 【发布时间】:2012-04-22 12:10:43 【问题描述】:

我现在正试图弄清楚我的代码/设置有什么问题。基本上我想从客户端向服务器发送一条消息。以下适用于所有浏览器除了 FF(11) 和 chrome(18.0.1025.152 m)。

这里有一些信息:

    我在 Windows 7 企业 64 位机器上运行 Node.js 我使用 apache 从 localhost 提供页面 我正在使用 socket.io 监听 8080 端口 看起来 chrome 和 FF 回退到 xhr-polling / jsonp-polling 而不是使用套接字 我可以从服务器推送消息,但我不能从客户端发送消息

服务器代码:

var io = require('C:/Users/shlomis/node_modules/socket.io/lib/socket.io').listen(8080);

io.sockets.on('connection', function (socket) 
    socket.on('my event', function (msg) 
        console.log("DATA!!!");
    );
);

如果没有完整路径,我找不到要求的方法

客户端代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <title>Hello World!</title>
    <meta charset="utf-8">

    <script src="http://localhost:8080/socket.io/socket.io.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function()
            var socket = io.connect('http://localhost:8080');
            $("#button").click(function() 
                socket.emit('my event' ,"Hello World!");
            )
        )
    </script>
</head>

<body>
<button type="button" id='button'>Send Message</button>
</body>

</html>

模块版本:

C:\Users\shlomis>npm ls
mukhin_chat@0.0.1 C:\Users\shlomis
├─┬ express@2.5.9
│ ├─┬ connect@1.8.6
│ │ └── formidable@1.0.9
│ ├── mime@1.2.4
│ ├── mkdirp@0.3.0
│ └── qs@0.4.2
└─┬ socket.io@0.9.5
  ├── policyfile@0.0.4
  ├── redis@0.6.7
  └─┬ socket.io-client@0.9.5
    ├─┬ active-x-obfuscator@0.0.1
    │ └── zeparser@0.0.5
    ├── uglify-js@1.2.5
    ├─┬ ws@0.4.12
    │ ├── commander@0.5.2
    │ └── options@0.0.3
    └── xmlhttprequest@1.2.2

节点日志:

C:\Users\shlomis>node C:\dev\wamp\www\AR\js\videoServer.js
   info  - socket.io started
   debug - served static content /socket.io.js
   debug - client authorized
   info  - handshake authorized 17502185141066845391
   debug - setting request GET /socket.io/1/websocket/17502185141066845391
   debug - set heartbeat interval for client 17502185141066845391
   debug - client authorized for
   debug - websocket writing 1::
   debug - setting request GET /socket.io/1/xhr-polling/17502185141066845391?t=1334041653716
   debug - setting poll timeout
   debug - discarding transport
   debug - cleared heartbeat interval for client 17502185141066845391

chrome WS 请求(101 切换协议):

chrome XHR 请求:

更新:我添加了

socket.on('connect', function () 
     console.log("connected");
);

它永远不会在 chrome 上触发。

那么可能出了什么问题?请帮忙:)

【问题讨论】:

我遇到了完全相同的问题...客户端上的 socket.emit('hello') 可以在 safari 中运行,但不能在 Firefox 或 chrome 中运行...安全限制可能吗?或者可能是 socket.io 错误。 可能是same-origin 策略,因为只有在使用XHR 时才会发生故障?尝试对 localhost:different-port-than-served-page 创建一个简单的 XHR,看看是否有任何安全异常。 没有安全问题,我现在将faye.jcoglan.com/node.html (faye) 用于节点 JS 上的套接字,它工作正常......对我来说就像一个 socket.io 错误。 哦,我也遇到了同样的问题 :(... 它几乎适用于除我之外的所有人。 这个问题有什么解决办法吗?我遇到了同样的问题.. :( 【参考方案1】:

我认为您为客户端使用了错误的 socket.io.js 文件?

https://github.com/LearnBoost/socket.io-client/tree/master/dist

你应该在你的客户端文件所在的文件夹中使用这些文件,即: ../js/socket.io.min.js

关于 require 的问题,你用的是 npm 吗?进入 nodeJS 项目文件夹并运行以下命令:

npm install socket.io

这应该安装到您项目文件夹内的node_modules 文件夹中,并且通过执行require('socket.io'); 您应该能够访问该模块。

如果这不起作用,您可能安装了损坏的节点。

PS:您是否为文件使用相同的端口?您似乎正在寻找 8080 端口上的 socket.io 文件,然后在 8080 端口上连接到 nodeJS 以进行套接字连接...

尝试使用其他端口?

【讨论】:

即使我也有同样的问题。它不适用于 Firefox 和 Chrome,但它在 IE 上运行良好。请帮忙。

以上是关于Socket.io 无法在 Chrome 和 Firefox 上向 Node 服务器发送消息的主要内容,如果未能解决你的问题,请参考以下文章

Socket.io 未设置 CORS 标头

Chrome 中的“意外响应代码:503”。也许与heroku上的socket.io有关?

Socket.io 在带有 redis 和 Laravel-echo-server 的 Web 浏览器 chrome 中没有显示任何内容

Websocket 不能在 heroku 中使用 socket.io

chrome 扩展背景 - socket.io 连接到 https 而不是 http

Socket.IO 在 Google Chrome 43.0.2357.65 上停止工作