[英]Socket.io rooms not working/making sense
我正在嘗試使用socket.io v1.2.0(和nodejs 0.12)確保每個人看到的消息都不同於另一個。
我是基於這個似乎無法正常工作的答案(也許是由於版本差異而定)? https://stackoverflow.com/a/19150254/1582712
// client side
var socket = io();
var room = new Date().getTime().toString() + "-" + Math.random().toString();
socket.emit('create', room);
// server side
io.sockets.on('connection', function(socket){
socket.on('create', function(room) {
socket.join(room);
});
});
當然,還有更多的代碼,但也許無關緊要。 我將在下面包含完整的代碼。 無論如何,我現在的期望是客戶端代碼(以某種方式)知道它屬於房間room
和/或服務器知道向給定room
發送適當的文本,無論哪種方式都不起作用!
// Server
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var id = "0";
var javaSessions = {_counter: -1};
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
var javaSessionId = javaSessions._counter++;
res.cookie('java_session_id', javaSessionId);
var msnId = req.query.msnId;
var spawn = require('child_process').spawn;
var java = spawn("java.exe",
['-cp', 'lib\\*;bin', 'com.app.App', ]);
javaSessions[javaSessionId] = java;
var outBuffer = "", errBuffer = "";
java.stdout.on('data', function(data) {
outBuffer += data.toString();
var lines = outBuffer.split("\n");
for (var i = 0; i < lines.length - 1; i++) {
var line = lines[i];
console.log(line);
io.to(id).emit('stdout', line);
}
outBuffer = lines[lines.length - 1];
});
java.stderr.on('data', function(data) {
errBuffer += data.toString();
var lines = errBuffer.split("\n");
for (var i = 0; i < lines.length - 1; i++) {
var line = lines[i];
console.log("err> " + line);
io.to(id).emit('stderr', id + " -- " + line);
}
errBuffer = lines[lines.length - 1];
});
java.stdout.on('end', function() {
console.log(outBuffer.id);
io.emit('stdout', outBuffer);
});
java.stderr.on('end', function() {
console.log(errBuffer.id);
io.emit('stderr', errBuffer);
});
});
app.get('/unload/:id', function(req, res) {
var java = javaSessions[req.params.id];
javaSessions[req.params.id] = null;
java.kill();
});
io.sockets.on('connection', function(socket){
socket.on('create', function(room) {
socket.join(room);
});
socket.on('stdout', function(msg){
io.emit('stdout', msg);
});
socket.on('stderr', function(msg){
io.emit('stderr', msg);
});
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
// Client
var socket = io();
var room = new Date().getTime().toString() + "-" + Math.random().toString();
socket.emit('create', room);
$('form').submit(function(){
socket.emit('stderr', $('#m').val());
$('#m').val('');
return false;
});
socket.on('stdout', function(data) {
$('#messages').append($('<li class = "stdout">').text(data));
});
socket.on('stderr', function(data) {
$('#messages').append($('<li class = "stderr">').text(data))
});
無論如何,如果只需要將數據發送到一個客戶端,則可能要使用另一種方法。
做這樣的事情
io.emit('stdout', msg);
將消息廣播給所有連接的人。 如果您只需要發送給1位客戶,則應該執行以下操作
socket.emit('stdout', msg);
這樣,您就不必為每個客戶創建新房間而采用這種愚蠢的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.