2012-03-23 245 views
25

我試圖實現一個系統與兩個客戶端其中一個發送消息,另一個將收到它。 下圖將解釋它在一個更直觀的方式:socket.io客戶端不接收來自服務器的消息

socket.io message communication chart

因此,客戶端1將消息發送到服務器(這工作),服務器接收一個「推」的消息,併發出應該由客戶端2拾取的「彈出」消息。 這裏的問題是客戶端2從未收到「彈出」消息。 :(

下面是全部的代碼。

SERVER.JS

var app = require('express').createServer() 
    , io = require('socket.io').listen(app); 

app.listen(999); 

app.get('/webclient', function (req, res) { 
    res.sendfile(__dirname + '/web.html'); 
}); 

app.get('/mobile', function (req, res) { 
    res.sendfile(__dirname + '/mobile.html'); 
}); 

io.sockets.on('connection', function (socket) { 
//  socket.emit('pop', { hello: 'world' }); 
    socket.on('push', function (data) { 
     console.log('push received, emitting a pop'); 
     socket.emit('pop', { hello: 'world' }); 
    }); 
}); 

CLIENT 1(又名mobile.html)

<html> 
    <head> 
     <title> 
      Mobile 
     </title> 
     <script src="/socket.io/socket.io.js"></script> 
     <script src="https://ajax.googleapis.com/ajax/libs/mootools/1.4.5/mootools-yui-compressed.js" type="text/javascript"></script> 
     <script> 
      var socket = io.connect('http://localhost:999'); 
     </script> 
    </head> 
    <body> 
     <input type="button" name="act" id="push" value="message" /> 
     <script type="text/javascript" charset="utf-8"> 
      window.addEvent('domready', function() { 
       $('push').addEvent('click', function() { 
        socket.emit('push', { hello: 'world' }); 
       }); 
      }); 
     </script> 
    </body> 
</html> 

客戶端2 (aka web.html)

<script src = "/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost:999'); 
    socket.on('pop', function (data) { 
    console.log(data); 
    }); 
</script> 

我只是不明白爲什麼客戶端2沒有收到「彈出」消息的原因, 我是很新的socket.io和一般的Node.js這樣一些機制來我還是有點晦澀,所以我提前爲我的noobness道歉。 :)

歡呼

-K-

+1

我對socket.io沒有經驗,但是如果我沒有弄錯'socket'會引用你收到消息的同一個套接字。你可以試試'io.sockets.emit'嗎? – pimvdb 2012-03-23 11:01:38

+0

工程就像一個魅力!如果你想作出回答,我可以把它標記爲正確的,並讓你+1 :) – holographix 2012-03-23 11:04:06

+5

+1對於一個有趣的問題問得好,並格式化 – beny23 2012-03-23 11:27:16

回答

15

傳遞給.on的函數被調用每個插座做初始化(綁定事件等),並socket指的是目前的插座。當您收到push消息時,這將是客戶端1,因爲處理函數綁定到socketpush事件 - 當客戶端1連接(socket引用客戶端1)時,您綁定了該函數。

io.sockets指的是所有連接的套接字,所以包括客戶端2在你的情況下。

+1

它的工作原理一個魅力,感謝噸:) – holographix 2012-03-23 11:38:40

12

,你可以考慮的另一個方面是使用的:

socket.broadcast.emit('push', { hello: 'world' });

這將基本上將消息發送給所有連接的客戶端,除了發起該消息中的一個。刪除過濾客戶端的任務/減少不必要的流量到始髮套接字。

Socket.IO on GitHub - 在廣播下。

+0

這也是有趣的,但現在我需要跟蹤我的客戶,我需要傳達的信息,以確定的客戶端,所以我管理了另一種解決方案,但這可能派上用場爲了未來,謝謝! – holographix 2012-03-23 12:08:27

+0

你,先生,值得讚賞。經過8個小時的嘗試,沒有結果,它對我很有幫助! – mozcelikors 2017-10-28 15:11:23

相關問題