我使用node.js和socket。我的浏览器很好地从服务器接收数据,但服务器没有从客户端(浏览器)接收数据。可能是client_data的事件监听器不工作。下面是服务器:
var http = require("http");
var url = require("url");
var io = require('socket.io');
function start(route) {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname;
console.log("Request for " + pathname + " received.");
route(pathname, response);
}
var server = http.createServer(onRequest);
server.listen(8888);
var server_io = io.listen(server);
server_io.on('connection', function(socket){
//send data to client
setInterval(function(){
socket.emit('date', {'date': new Date()});
}, 1000);
});
//recieve client data
server_io.on('client_data', function(data){ //May be it is not listening
process.stdout.write(data.letter); // not working
//console.log(data.letter); not working
});
console.log("Server has started.");
}
exports.start = start;
客户机代码:<html>
<head>
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<script>
var socket = io.connect();
socket.on('date', function(data){
document.getElementById("date").innerHTML = data.date;
});
function sendKey(e){
socket.emit('client_data', {'letter': String.fromCharCode(e.charCode)});
}
</script>
<div id="date">This is our socket.html file</div>
<textarea id="text" onKeyPress="sendKey(event)"></textarea>
</body>
</html>
我的服务器代码有什么问题?
出现此错误是因为.on('client_data')
必须绑定到socket
,而不是server_io
。代码可能如下所示:
server_io.on('connection', function(socket){
setInterval(function(){
socket.emit('date', {'date': new Date()});
}, 1000);
socket.on('client_data', function(data){
process.stdout.write(data.letter);
});
});
server_io
只接收connection
事件。从客户端发送的client_data
事件被传递给connection
回调的socket
对象听到,而不是server_io
对象。
您需要使用socket.on("client_data", ...);
并将该代码移动到connection
回调中。
socket
对象连接到一个特定的客户端web页面实例,并且它只接收该页面发送的消息。每次新的客户端页面连接时,都会创建一个新的socket
对象,并将其作为参数传递给connection
处理程序函数。