使用 NodeJS 的服务器端推送
Server-side push using NodeJS
我想使用 NodeJS 实现服务器端推送功能。
现在,我想要的只是一个监听特定 URL 请求的服务器(例如 http://localhost:8000/inputData?data=hello
)
发出此请求后,我希望所有客户都能查看 client.html
到 运行 alert(hello);
。我在服务器端所做的是:
var app = require('http').createServer(handler),
io = require('socket.io').listen(app),
parser = new require('xml2json'),
fs = require('fs'),
url = require('url');
var qs = require('querystring');
app.listen(8000);
console.log('server listening on localhost:8000');
function handler(req, res) {
var url_parts = url.parse(req.url, true);
var pathname = url_parts.pathname;
switch(pathname){
case '/inputData':
var data = url_parts.query.data;
socket.emit('notifyData', data); //socket is undefined
break;
default:
fs.readFile(__dirname + '/client.html', function(err, data) {
if (err) {
console.log(err);
res.writeHead(500);
return res.end('Error loading client.html');
}
res.writeHead(200);
res.end(data);
});
}
;
}
在客户端,client.html
:
<script>
var socket = io.connect('http://localhost:8000');
socket.on('notifyData', function (data) {
alert(data);
});
</script>
我收到一条错误消息,指出 socket
未定义。我知道我应该早点定义它,但我不知道该怎么做..
这是解决此类问题的正确方法吗?或者 emit
应该在不同的文件中,例如inputData.html
?我宁愿补充我已有的代码,因为我可能需要在 var data= url_parts.query.data
之前进行一组操作
从 docs 来看,您似乎没有正确初始化服务器。
var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
app.listen(8000);
/*...*/
io.on('connection', function (socket) {
socket.emit('notifyData', { hello: 'world' });
});
在客户端你应该有
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io('http://localhost:8000');
socket.on('notifyData', function (data) {
alert(data);
});
</script>
您的服务器存在设计问题,因为根本没有定义 socket
变量。如果你想做的是在任何一个点击特定 URL 时向所有客户端广播,那么你可以这样做:
io.sockets.emit('notifyData', data);
如果您尝试发送到单个客户端套接字,那么您将必须找到一种方法来确定您要发送到 io.sockets
命名空间中的哪个套接字。
我想使用 NodeJS 实现服务器端推送功能。
现在,我想要的只是一个监听特定 URL 请求的服务器(例如 http://localhost:8000/inputData?data=hello
)
发出此请求后,我希望所有客户都能查看 client.html
到 运行 alert(hello);
。我在服务器端所做的是:
var app = require('http').createServer(handler),
io = require('socket.io').listen(app),
parser = new require('xml2json'),
fs = require('fs'),
url = require('url');
var qs = require('querystring');
app.listen(8000);
console.log('server listening on localhost:8000');
function handler(req, res) {
var url_parts = url.parse(req.url, true);
var pathname = url_parts.pathname;
switch(pathname){
case '/inputData':
var data = url_parts.query.data;
socket.emit('notifyData', data); //socket is undefined
break;
default:
fs.readFile(__dirname + '/client.html', function(err, data) {
if (err) {
console.log(err);
res.writeHead(500);
return res.end('Error loading client.html');
}
res.writeHead(200);
res.end(data);
});
}
;
}
在客户端,client.html
:
<script>
var socket = io.connect('http://localhost:8000');
socket.on('notifyData', function (data) {
alert(data);
});
</script>
我收到一条错误消息,指出 socket
未定义。我知道我应该早点定义它,但我不知道该怎么做..
这是解决此类问题的正确方法吗?或者 emit
应该在不同的文件中,例如inputData.html
?我宁愿补充我已有的代码,因为我可能需要在 var data= url_parts.query.data
从 docs 来看,您似乎没有正确初始化服务器。
var app = require('http').createServer(handler)
var io = require('socket.io')(app);
var fs = require('fs');
app.listen(8000);
/*...*/
io.on('connection', function (socket) {
socket.emit('notifyData', { hello: 'world' });
});
在客户端你应该有
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io('http://localhost:8000');
socket.on('notifyData', function (data) {
alert(data);
});
</script>
您的服务器存在设计问题,因为根本没有定义 socket
变量。如果你想做的是在任何一个点击特定 URL 时向所有客户端广播,那么你可以这样做:
io.sockets.emit('notifyData', data);
如果您尝试发送到单个客户端套接字,那么您将必须找到一种方法来确定您要发送到 io.sockets
命名空间中的哪个套接字。