【发布时间】:2014-05-13 10:44:06
【问题描述】:
我是 node.js/socket.io/websocket 的新手,我正在尝试创建一个网络聊天应用程序。目前我被困在一个问题上好几天了:无论我多么努力,我都无法通过 websocket 进行浏览器/服务器通信。
我的服务器代码:
var express = require("express");
var app = express();
var port = 3700;
var io = require('socket.io').listen(app.listen(port));
console.log("Listening on port " + port);
io.sockets.on('connection', function (socket) {
console.log("connect");
socket.emit('globalmessage', { message: 'welcome to the chat !' });
socket.on('send', function (data) {
io.sockets.emit('message', data);
});
});
我的客户代码:
var messages = [];
var socket = io.connect('http://localhost:3700');
var field = document.getElementById("field");
var sendButton = document.getElementById("send");
var content = document.getElementById("content");
var name = 'test';
var role = 1;
socket.on('message', function (data) {
if(data.message) {
messages.push(data);
var html = '';
for(var i=0; i<messages.length; i++) {
html += messages[i].message + '<br />';
}
content.innerHTML = html;
} else {
console.log("There is a problem:", data);
}
});
socket.on('globalmessage', function (data) {
content.innerHTML += data.message;
});
sendButton.onclick = function() {
var text = field.value;
socket.emit('send', { message: text, username: name, role: userrole});
};
当我启动节点 js 服务器并通过浏览器(chrome 和 firefox)访问客户端时,我在 cmd windows 中获得了这些数据:
info - socket.io started
Listening on port 3700
debug - served static content /socket.io.js
debug - client authorized
info - handshake authorized 7492ni4I5TCkRNvfG8WU
debug - setting request GET /socket.io/1/websocket/7492ni4I5TC
debug - set heartbeat interval for client 7492ni4I5TCkRNvfG8WU
debug - client authorized for
debug - websocket writing 1::
connect
debug - websocket writing 5:::{"name":"globalmessage","args":[
come to the chat !"}]}
debug - emitting heartbeat for client 7492ni4I5TCkRNvfG8WU
debug - websocket writing 2::
debug - set heartbeat timeout for client 7492ni4I5TCkRNvfG8WU
如你所见,有 websocket 写 5:::{"name":"globalmessage","args":[ Welcome to the chat !"}]} 这意味着当客户端连接时服务器可以读取,并且确实将消息发送回客户端,但在客户端没有任何反应,我无法读取消息,事件根本没有触发。当我尝试从客户端向服务器发送消息时也没有任何反应。
在萤火虫控制台我看到有 1 个成功请求来解决
localhost:3700/socket.io/1/?t=1399976614584
响应 7492ni4I5TCkRNvfG8WU:60:60:websocket
如果我将传输从 websocket 更改为 xhr-polling 一切正常,客户端可以接收服务器消息,可以将消息发送回服务器,所以我认为代码很好(实际上我从 http://code.tutsplus.com/tutorials/real-time-chat-with-nodejs-socketio-and-expressjs--net-31708 复制了代码) .
那么你能帮我解决我当地的 websocket 设置有什么问题吗?我不知道出了什么问题,因为 ajax 轮询一切正常,我真的需要它来使用 websocket。我所有的测试都是在我的本地完成的:windows 7 home premium,xampp 3.1.0(即使我关闭了 apache,websocket 也无法工作)
谢谢大家!
【问题讨论】:
-
那么,当您单击
sendButton时,什么都没有发生?我建议在按钮的onclick处理程序和socket.on('message'处理程序中放置一些console.logs。