2011-08-03 12 views
1

私はnode.jsについて数週間前から読んでいました。私はLinuxとLinuxのサーバ(基本的にはUbuntu Linux)上で、nodeとsocket.ioといくつかの他のパッケージ(expressといくつかは私が覚えていないもの)をインストールしました。私はいくつかのチュートリアルを見つけてそれらを通って、クライアントのどれかにメッセージをサーバーに送り返すことはできません。Socket.ioクライアントがサーバーに接続していない

シンプルなチャットルーム http://vivahate.com/2011/03/25/a-simple-chat-room-in-node-js/

シンプルSocket.ioリアルタイムのチャット http://webdevrefinery.com/forums/topic/7991-simple-socketio-real-time-chat/:ここで私が通過したチュートリアルのいくつかは、(私はより多くを持っていますが、サイトは私がより多くのリンクを投稿することはできないだろう)です

webdevrefineryにはウェブ上にライブデモがあり、ブラウザでは2台の異なるコンピュータから動作します。ダウンロードして実行したコードへのリンクがあり、サーバーは正常に動作します。私は自分のLAN上のURL(192.168.0.30:3000)に行き、URLを参照するとすぐに正しいHTMLとコンソール出力 "debug-served static /socket.io.js"を表示します。私が情報を入力し、それが "入力"何も起こりません。私はコードにアラートを入れ、 "sendMsg()"の "socket.send"行で失敗するようです。

server.js:

var http = require('http'), 
    sys = require('sys'), 
    fs = require('fs'), 
    io = require('socket.io'); 

var server = http.createServer(function(req, res) { 
    fs.readFile('chat.html', 'binary', function(err, data) { 
     if(err) { 
      res.writeHead(500, {'Content-type': 'text/html'}); 
      res.write(data + "\n"); 
      res.end(); 
      return; 
     } 

     res.writeHead(200, {'Content-type': 'text/html'}); 
     res.write(data, 'binary'); 
     res.end(); 
    }); 
}); 
server.listen(3000); 

var socket = io.listen(server); 
socket.on('connection', function(client) { 
    client.on('message', function(data) { 
     console.log("Message: " + JSON.stringify(data)); 
     socket.broadcast(data); 
    }); 
    client.on('disconnect', function() { 
    }); 
}); 

client.html

<html> 
<head> 
<style type="text/css"> 
#msgs { 
    height: 50%; 
    overflow-y: scroll; 
} 

div.odd { 
    background-color: gray; 
} 
</style> 
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script> 
<script type="text/javascript" src="http://192.168.0.30:3000/socket.io/socket.io.js"></script> 
<title>Realtime Chat Test</title> 
</head> 
<body> 
<div id="container"> 
<div id="msgs"></div> 
<div id="form"> 
<form id="chat" action="javascript:sendMsg()"> 
Username:<input type="text" name="username" /><br /> 

Message:<input id="msg" type="text" name="message" /><br /> 
<input type="submit" /> 
</form> 
</div> 
</div> 
</body> 
<script type="text/javascript"> 
var socket = new io.Socket("192.168.0.30", {port:3000}); 
socket.connect(); 

var classes = new Array('even', 'odd'); 
var numMsgs = 0; 

function reconnect() { 
    if(socket.connecting) { 
     setTimeout('reconnect()',1000); 
    } 
    else if(!socket.connected) { 
     socket.connect(); 
     setTimeout('reconnect()',1000); 
    } 
} 

socket.on('disconnect', function() { 
    reconnect(); 
}); 

socket.on('message', function(data) { 
    var ms = JSON.parse(data); 
    if(ms.username !== undefined && ms.message !== undefined) { 
     numMsgs++; 
     $('#msgs').append(function() { 
      var d = $('<div class="'+classes[numMsgs%2]+'"/>'); 
      d.text(ms.username + ' says: ' + ms.message); 
      return d; 
     }); 
     var objDiv = document.getElementById('msgs'); 
     objDiv.scrollTop = objDiv.scrollHeight; 
    } 
}); 

function sendMsg() { 
    var values = {}; 
    $.each($('#chat').serializeArray(), function(i,v) { 
     values[v.name] = v.value; 
    }); 
    document.getElementById("msg").value = ""; 
    socket.send(JSON.stringify(values)); 
} 
</script> 
</html> 

私が使用しているのLinuxのディストリビューションのようなXか何かを持っていませんが、ここで私が使用しているコードがあります私はWindowsマシンからすべてのブラウジングを行うので、私はlocalhostからテストしていないのですが、HTMLが提供されていることが証明されているので、他のホストからもうまくいくはずです。ページ。なぜクライアントからサーバーにメッセージが届かないのかについてのアイデアはありますか?私は、私が試した約8つの他のチュートリアルと同じミスをしていると仮定していますが、私はいつも同じ問題があります。ありがとう。

ダリル

答えて

0

私はあなたの問題があなたの依存関係にあると確信していますか?のは、例えば、私の依存関係を見てみましょう:

$ npm ls 

├─┬ [email protected] 
│ ├─┬ [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ └── [email protected] 
├─┬ [email protected] 
│ ├── [email protected] extraneous 
│ ├── [email protected] 
│ ├── [email protected] 
│ └─┬ [email protected] 
│ └── [email protected] 

socket.io 0.6.xからAPIは、いくつかの大きな変化を受け0.7.xします。あなたがsocket.io 0.6.xを使って古いチュートリアルを読んでいるようで、0.7.xをインストールしたようです。 migration instructionsとお伝えします。

私は、うまくいけば本当に簡単なデモ(あなたがインストールしたエクスプレスを利用する)を提供したいと思います。

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

app.get('/', function(req, res){ 
    res.send('<script src="/socket.io/socket.io.js"></script>\ 
<script>\ 
    var socket = io.connect("http://192.168.0.30");\ 
    socket.on("news", function (data) {\ 
    alert(data.hello);\ 
    });\ 
</script>'); 
}); 

app.listen(3000); 

var io = sio.listen(app); 

io.sockets.on('connection', function (socket) { 
    socket.emit('news', { hello: 'world' }); 
}); 

socket.ioサーバーに接続すると、worldに警告する必要があります。私はまた、あなたの例では、フォルダnode_modules内部のディレクトリ内の今、最新の0.6.xでsocket.io 0.6.18をインストールしていると動作すると思います何


。 Node.jsには、node.js module systemのおかげでそのモジュールがローカルに含まれます。これを行うには、そのディレクトリがまだ存在しない場合は、mkdir -p node_modulesを作成します。次に、socket.ioを発行してnpm install [email protected]を発行します。それで、私はあなたがそれらの古い例を実行できるはずだと思います。

+0

ありがとうございました!私が見つけたすべてのチュートリアルは、たとえ先月作ったとしても、「古い」と思われます。実際に現在動作しているチュートリアルは知っていますか?私は、古くなったコードベースのために働くコードを手に入れようとすると、それほど大きくない。ああ、あなたが提供したコードスニペットはうまくいきましたが、単なるサーバーではなく、サーバーとクライアントを持つことにはどういう関係があるのでしょうか。 0.6と0.7の違いを持つsocket.ioページが助けられましたが、それには指示がないホームページに単にリンクする情報へのリンクのようなものがあります。 – Darryl

+1

@Darryl私はクライアントとサーバーを持っています!しかし、簡単にするために、私はそれをすべて1つのファイルに入れました!私は多くの新しいチュートリアルを知らないが、この例は興味深い例=> http://www.danielbaulig.de/socket-ioexpress/である。また、私はgithub(WIKI)=> https://github.com/learnboost/socket.io/wikiとhttp://socket.ioでドキュメントを指摘したいと思います。 – Alfred

+1

私のチュートリアルに言及するため+1)@Darryl:あなたは実際には[socket.io](http://socket.io/)で単純な例を使用し、そこから成長する必要があります。それは愚かな証拠のアプローチです。より複雑な例を取り、あなたのニーズに合わせて減らすことは、成功していない道ではありません。 –

1

これはアルフレッドの答えの後のコメントに対するものです。私はその行に別のコメントを書く方法を理解できなかったので、私は "回答"を投稿しています。

@ Alfred - 例のおかげで、ダニエルは単純なメッセージを伝えていないと考えていると言いましたが、それはたくさんあるようです。 @Daniel - ドキュメンテーションがある限り、私はsocket.ioホームページで実際にサンプルを使用する方法のアイデアはまだ得られません。何もしない「使用方法」リンクと、その例について何も説明していないWikiリンクがあります。私はサーバーを起動する方法を知っていますが、依然としてクライアントをサーバーに接続する方法や、クライアントを「起動する」方法を知りません。ほとんどのチュートリアルには、サーバーからのクライアントページを指し示す何らかの「リンクコード」があり、ブラウザーで「http:// yoursiteaddress:port」を指すとページが表示されます。 socket.ioホームページのコードには、クライアントコードとサーバーコードの間にこのような「接続」はありません。あなたは "クライアント"のコードにサーフィンすることになっていますか?私はそれを試して、それは意味がある "http:// yoursiteaddress:port"に行くと仮定してどのURLに行ってもまったく同じコードを提供しますが、実際にその使い方を説明している文書は見ていませんコード。したがって、私は明らかにすべて古いコードを使用するチュートリアルに行きます。私が紛失している文書がありますか?

関連する問題