Node.jsとsocket.ioを使い始めようとしています。
私は非常に(very)シンプルなクライアントサーバーテストアプリケーションを使用していますが、動作させることができません。
システムは、Apacheサーバーを備えたWindowsマシン上にセットアップされています。
Apacheはport 81
で実行されており、socket.ioはport 8001
をリッスンするように設定されています
サーバー-server.js
var io = require('socket.io').listen(8001);
io.sockets.on('connection', function (socket) {
console.log('\ngot a new connection from: ' + socket.id + '\n');
});
クライアント-index.html
<!DOCTYPE html>
<html>
<head>
<title>node-tests</title>
<script type="text/javascript" src="http://localhost:8001/socket.io/socket.io.js"> </script>
<script type="text/javascript">
var socket = io.connect('http://localhost', { port: 8001 });
socket.on('connect', function () {
alert('connect');
});
socket.on('error', function (data) {
console.log(data || 'error');
});
socket.on('connect_failed', function (data) {
console.log(data || 'connect_failed');
});
</script>
</head>
<body>
</body>
</html>
node server.js
を使用してサーバーを起動すると、標準(予想される)出力がサーバーコンソールに書き込まれます。
info: socket.io started
ブラウザでindex.html
を開くと(私の場合はクロム-他のブラウザでテストしていません)、次のログがサーバーコンソールに書き込まれます。
info: socket.io started
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized 9952353481638352052
debug: setting request GET /socket.io/1/websocket/9952353481638352052
debug: set heartbeat interval for client 9952353481638352052
debug: client authorized for
got a new connection from: 9952353481638352052
debug: setting request GET /socket.io/1/xhr-polling/9952353481638352052?t=1333635235315
debug: setting poll timeout
debug: discarding transport
debug: cleared heartbeat interval for client 9952353481638352052
debug: setting request GET /socket.io/1/jsonp-polling/9952353481638352052?t=1333635238316&i=0
debug: setting poll timeout
debug: discarding transport
debug: clearing poll timeout
debug: clearing poll timeout
debug: jsonppolling writing io.j[0]("8::");
debug: set close timeout for client 9952353481638352052
debug: jsonppolling closed due to exceeded duration
debug: setting request GET /socket.io/1/jsonp-polling/9952353481638352052?t=1333635258339&i=0
...
...
...
ブラウザコンソールで次のようにします。
connect_failed
したがって、クライアントはサーバーに到達して接続しようとしているようで、サーバーはハンドシェイクを承認していますが、クライアントでconnect
イベントが発生することはなく、代わりにconnectメソッドがconnect timeout
に到達し、 max reconnection attempts
そしてconnect_failed
を返すのをあきらめます。
これに関するヘルプ\洞察は役立ちます。
ありがとうございました
//Client side
<script src="http://yourdomain.com:8001/socket.io/socket.io.js"></script>
var socket = io.connect('http://yourdomain.com:8001');
//Server side
var io = require('socket.io').listen(8001);
io.sockets.on('connection',function(socket) {
`console.log('a user connected');`
});
クライアント側:クライアント側のコードは、サーバー側のsocketIOを提供する同じファイルからクライアントバージョンのsocket IOを要求します。Varソケットには、socketIOで使用可能なすべてのメソッドsocket.emitまたはsocket.on
サーバー側:クライアント側と同じ、var ioの下でsocketIOメソッドを使用できるようにします。
フロントエンド(クライアント)の変更:
var socket = io.connect(http://myapp.herokuapp.com);
に
var socket = io.connect();
サーバーへの接続を適切に登録しなかったさまざまなクライアント(Chrome、Firefoxブラウザー、Phonegapアプリ)を何時間も処理した後(つまりサーバーはログにwebsocket接続を正常に登録しましたが、フロントエンドは接続イベントを登録しませんでした)、コメントから@Timothyのソリューションを試しましたが、すべてがherokuとlocalhostで再び動作します。
これを使ってみてください:
Server.js
var http = require("http").createServer(), io = require("socket.io").listen(http);
http.listen(8001);
io.sockets.on("connection", function(socket){
console.log("Connected!");
socket.emit("foo", "Now, we are connected");
});
index.html
<script src="http://localhost:8001/socket.io/socket.io.js"></script>
<script>
var i = io.connect("http://localhost:5001");
i.on("foo", function(bar){
console.log(bar);
})
</script>
以下を試してください:
変化する
var socket = io.connect('http://localhost', { port: 8001 });
に
var socket = io.connect('http://localhost:8001');