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 服务器发送消息的主要内容,如果未能解决你的问题,请参考以下文章
Chrome 中的“意外响应代码:503”。也许与heroku上的socket.io有关?
Socket.io 在带有 redis 和 Laravel-echo-server 的 Web 浏览器 chrome 中没有显示任何内容
Websocket 不能在 heroku 中使用 socket.io