2016-03-27 14 views
1

Node.jsとSocket.ioを使用してコマンドラインチャットルームを構築しようとしています。サーバー上でSocket.io接続イベントが発生しない

これはこれまでのところ、私は(速達で、公式サイトのチュートリアルのような、そしてそれなし)の両方のhttp initialisationsでこれを試してみました、私のサーバー側のコードです:

#app = require('express')() 
#http = require('http').Server(app) 
http = require('http').createServer() 
io = require('socket.io')(http) 


io.sockets.on 'connect', (socket) -> 
    console.log 'a user connected' 


http.listen 3000,() -> 
    console.log 'listening on *:3000' 

私はnodejs server.jsでこれを起動します"Listening on"が表示されます。

lsof -i tcp:3000を実行すると、server.jsプロセスが表示されます。私は、このクライアント側のコードを起動したときに

しかし、私はnodejsのclient.jsを実行していない、どちらもサーバーもクライアントからのイベントを、「接続」すると

socket = require('socket.io-client')('localhost:3000', {}) 

socket.on 'connect', (socket) -> 
    console.log "Connected" 

ない運...、解雇されています!

私の質問は次のとおりです。 - 私は間違っていますか? - HTTPサーバーを使用するには、そのサーバーを起動する必要がありますか?ソケットはトランスポート層にあります。理論的に私はメッセージを交換するためにHTTPプロトコルを必要としません。

+0

これはCoffeescriptです... – Matheus208

答えて

0

これはサーバーとサーバー間の接続で、socket.io接続(通常のHTTP接続では設定しない)の場合のみ、このコードはsocket.io接続の簡単な方法を示しています。 socket.io専用サーバー

// Load the library and initialize a server on port 3000 
// This will create an underlying HTTP server, start it and bind socket.io to it 
const io = require('socket.io')(3000); 

// listen for incoming client connections and log connect and disconnect events 
io.on('connection', function (socket) { 
    console.log("socket.io connect: ", socket.id); 

    socket.on('disconnect', function() { 
     console.log("socket.io disconnect: ", socket.id); 
    }); 
}); 

Node.jsのsocket.ioクライアントを聞く

- 別socket.ioサーバに

を接続します

このコードは、自分のコンピュータで機能します。私は同じホスト上で2つの別々のnode.jsアプリケーションを実行することができ、彼らはお互いに話すことができ、両方とも接続イベントと切断イベントを見ることができます。

いくつか説明する

socket.ioプロトコルはHTTPサーバへのHTTP接続を行うことにより開始されます。したがって、socket.io接続があるときはいつでも、どこかでリッスンしているHTTPサーバーがあります。そのHTTP接続は、最初に、webSocketプロトコルへの「アップグレード」要求であり、いくつかの追加のセキュリティ情報が含まれていることをサーバーに示す特別なヘッダーとともに送信されます。

これは、WebSocket接続が最初に確立される方法についてのpretty great referenceです。何が起こるかを段階的に示します。

両者がプロトコルの「アップグレード」に同意すると、プロトコルはwebSocketに切り替えられます(socket.ioは基本WebSocketプロトコルの上に追加のプロトコル層ですが、HTTP/webSocketレベル)。アップグレードが合意されると、もともと入ってくるHTTP接続とまったく同じTCP接続が再利用され、webSocket/socket.io接続になります。

socket.ioサーバー側ライブラリでは、HTTPサーバーを自分で作成し、それをsocket.ioに渡すか、socket.ioに作成することができます。ソケットだけを使用している場合。ioを使ってこのサーバに接続し、httpサーバを使って通常のhttpリクエストを共有することもできません。上記の最小限のコード例では、単にsocket.ioにHTTPサーバーを透過的に作成させ、次にsocket.ioをバインドします。 httpサーバーから通常のWebリクエストを受け取りたい場合は、httpサーバーを最初に作成し、socket.ioに渡してsocket.ioを既存のhttpサーバーにバインドできるようにします。

次に、socket.ioがwebSocketトランスポートを使用していることに注意してください。これはwebSocketトランスポートの上に追加されたパケット構造です。これは、HTTP接続を介してJSONを送信することに同意するのに似ています。 HTTPは、ホストのトランスポートと基礎となるデータ形式です。双方は、JSON形式のデータをフォーマットし、HTTP経由でデータを送信することに同意します。そのようにして、socket.ioメッセージ形式がwebSocketの上に置かれます。

ご質問

それはそれを使用するHTTPサーバを起動するために必要ですか?

はい、すべてのsocket.io接続がHTTPサーバーへのHTTP要求で始まるため、HTTPサーバーはどこかに存在する必要があります。

ソケットはトランスポート層にあります。

初期の接続プロトコルスタックは次のように動作します。

TCP <- HTTP protocol 

次に、プロトコルのアップグレード後:だからのWebSocket輸送へのHTTPからプロトコルアップグレード後

TCP <- webSocket <- socket.io 

、あなたはその後、 socket.ioパケットフォーマットは、TCPの上にあるwebSocketフォーマットの上にあります。

理論上、私はメッセージを交換するためにHTTPプロトコルは必要ありません。

いいえ、正しくありません。すべての接続は、最初にHTTPで確立されます。アップグレードがwebSocketトランスポートに行われると、HTTPは使用されなくなります。

+0

@ Matheus208 - これはあなたの質問に答えましたか?もしそうなら、答えの左側にある緑のチェックマークをチェックして、あなたの質問が今答えられたことをコミュニティに示すとともに、適切な手順に従うための評判のポイントを獲得してください。これであなたの質問に答えることができなかった場合は、それがまだ欠けているものについてコメントしてください。回答を編集してそれを完成させることができます。 – jfriend00

関連する問題