2012-02-25 64 views
16

我有麻煩,甚至得到非常基本的socket.io樣品運行。例如他們的網站的歡迎頁面上的第一個例子:得到基本socket.io樣品工作

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
    socket.on('my other event', function (data) { 
    console.log(data); 
    }); 
}); 

在服務器端和

<script src="/socket.io/socket.io.js"></script> 
<script> 
    var socket = io.connect('http://localhost'); 
    socket.on('news', function (data) { 
    console.log(data); 
    socket.emit('my other event', { my: 'data' }); 
    }); 
</script> 
在客戶端

。如果我保存在服務器端的host.js文件,並在文件client.htm客戶端,我跑npm host.js,我得到

info - socket.io started 
    warn - error raised: Error: listen EADDRINUSE 

這已經不是真的預期。那麼,對於client.htm(或至少這就是我認爲我應該用它做 - 將其粘貼在client.htm文件),我只得到一個空白屏幕。不是很奇怪,因爲它首先包含一個不存在的文件/socket.io/socket.io.js,但即使將其更改爲host.js(我認爲它應該是)並不會改變我僅獲得空白屏幕的事實...

我無能爲力。

回答

16

EADDRINUSE意味着該地址已在使用,因此它不能得到插座。其他的東西是否已經在你的機器上的80端口上運行? 80通常由Web服務器使用。

你也可以嘗試一些其他的端口上。

的原因,你看到一個空白文件是它不連接到節點服務器(因爲它不能讓插座),所以對新聞事件將永遠不會被調用。它甚至可以連接到任何其他的80運行的插座您解決端口衝突後,將絕不會發出該事件:)

,當您運行的服務器,它應該只是說:

info - socket.io開始

現在它正在等待連接。

確保您更新HTM線的端口。例如,如果81:

var socket = io.connect('http://localhost:81'); // note the :81 

編輯: 我只是想出來,並在htm文件,我不得不相對路徑設置爲socket.io.js文件。通過npm安裝後,它在我的目錄中。

<script src="node_modules/socket.io/node_modules/socket.io-client/dist/socket.io.js"></script> 

確保路徑是相對於htm文件(不以/開頭)。以下是我發現在那裏我的是:

find . -name 'socket.io.js' 

在Win: DIR socket.io。JS/s的

你也應該運行帶有(對* nix中你可能需要在前面須藤)主機:

node host.js 

最後一件事想的樣品時,被改變的htm文件一對夫婦行我做了爲此,我可以在事件發生時看到提醒消息框:

socket.on('news', function (data) { 
    alert(JSON.stringify(data)); 
+1

這有什麼關係?我嘗試了81,現在它只是在運行主機端時掛起,即它說'info - socket.io started',但它不會返回到命令行。 .htm頁面仍然是空白的,所以這似乎不能解決問題。 – user1111929 2012-02-25 21:09:50

+3

它解決了EADDRINUSE錯誤,這是您的第一個問題。是的,它很重要。它也沒有掛起 - 服務器正在等待通信。所以,現在你已經解決了服務器端問題的一半。 – bryanmac 2012-02-25 21:24:21

+0

對於客戶端的問題,你是否更新了htm頁面來連接到http:// localhost:81(不是:81)? – bryanmac 2012-02-25 21:24:54