2014-02-10 99 views
1

是否可以全局發送給發件人,但在socket.on('connect')事件之外?我正在尋找類似socket.broadcast.to().emit()我可以在app.post方法,這是不是在連接方法使用,所以我不能只使用socket.emitsocket.io只發送給socket.on('connect')以外的發件人

app.post('/room', function(req, res) { 
      io.sockets.emit('something');   

}); 

「東西」我只想發射到SENDER

我的代碼:

socket_id; 

app.post('/room', function(req, res) { 
     if (req.body.user == ''){ 
     io.sockets.socket(socket_id).emit('usernameError', 'Type your username'); 
    } 
    else if (users[req.body.user] !== undefined) { 
     io.sockets.socket(socket_id).emit('usernameError', 'Username exists.'); 
    } 
      else{ 
     users[req.body.user] = req.body.user; 
     user = req.body.user; 
     io.sockets.emit('newUser', user+' join to the room');    
       res.render('room'); 
        }  
}); 

io.sockets.on('connection', function(socket) { 
    socket.username = user; 
    socket.join('room1'); 
    socket.id = socket_id; 
}); 
+0

您是否使用AJAX或HTML表單向'/ room'發送請求? – Curious

+0

我使用的是Jade模板:form(name =「input」,action ='/ room',method ='post') – elevenMinutes

回答

0

據我知道你想「東西」發送到剛剛來到/room頁面,右邊的用戶?
如果是這樣,您不能在app.post方法中執行此操作,因爲此代碼將在之前執行,客戶端將收到HTML代碼 ,因此客戶端和服務器之間的握手將不會建立。

我認爲最好的解決辦法是執行在客戶端下面的代碼只/room頁:在服務器上

var socket = io.connect('/'); //your socket.io connection (may be different) 
socket.on('something', function(data) { 
    console.log(data); 
}); 
socket.emit('i_am_room_page'); //tell server we are on /room page 

和:

io.sockets.on('connection', function(socket) { 
    socket.on('i_am_room_page', function(data) { 
    socket.emit('something', {your: 'data'}); 
    }); 
}); 

希望這有助於

+0

我更新了我的代碼。你的想法很好,但我想在app.post中做所有這些,因爲我可以看到一個小驗證。 – elevenMinutes

0

如果不知何故,您可以將發件人的socektID存儲在變量中,那麼您可以在app.post方法中發送給該特定客戶端。做這樣的事情:

var id; 
io.sockets.on('connection', function(socket){ 
    socket.on('some event'){ 
    id = socket.id; 
    } 
}); 

和app.post方法做到這一點:

app.post('/room', function(req, res) { 
    io.sockets.socket(socketid).emit('event name', {data: yourData}); 
}); 

雖然我提出這個解決辦法,但你的做法似乎並沒有太大的說服力。

+0

聽起來不錯,但socketID是客戶端連接時產生的,所以首先app.post會完成。請看我的更新代碼。也許app.post可以在io.sockets.on('連接')或之後?這是正確的方法嗎? – elevenMinutes

+0

你在爲客戶端渲染兩個頁面嗎?我的意思是第一個客戶端點擊一個特定的URL,然後渲染,讓我們假設,login.jade和驗證後渲染room.jade? –

+0

是的,索引是一個起始頁面。 app.get('/',function(req,res)res.render('index'); });有我的登錄表 – elevenMinutes

相關問題