2015-09-27 13 views
7

私はnode.jsを使ってcharのようなものを作成しようとしています 私はnodejsの初心者です。socket.ioなしで作成したいと思っています。 ここに私が使用しているコードです。node js net sockets + websocket without socket.io

var http = require('http'); 
var net = require('net'); 


var server = http.createServer(function(req,res){ 

    res.writeHead(200,{'content-type' : 'text/html'}); 
    res.write('<a href="./lol/">lol</a><br>'); 
    res.end('hello world: '+req.url); 



    var client = new net.Socket(); 
    client.connect('7001', '127.0.0.1', function() { 

     console.log('CONNECTED TO: '); 
     // Write a message to the socket as soon as the client is connected, the server will receive it as message from the client 
     client.write('I am Chuck Norris!'); 

    }); 

    // Add a 'data' event handler for the client socket 
    // data is what the server sent to this socket 
    client.on('data', function(data) { 

     console.log('DATA: ' + data); 
     // Close the client socket completely 
     client.destroy(); 

    }); 

    // Add a 'close' event handler for the client socket 
    client.on('close', function() { 
     console.log('Connection closed'); 
    }); 
    //req. 

}); 
server.listen(7000); 


require('net').createServer(function (socket) { 
    console.log("connected"); 

    socket.on('data', function (data) { 
     console.log(data.toString()); 
    }); 
}).listen(7001); 

すべてうまく動作します(私は思う)。 私はlocalhostを開いている:7000私は、 "接続された"と "接続された"と "私はチャックノリスです"というノードのCMDメッセージを受け取っています。 その後、私は、ブラウザのコンソールに書き込みをしようとしている。また

var conn = new WebSocket('ws://localhost:7001/'); 

エラーなし、しかし、私はこの行をしようとしているとき:

conn.send('lol'); 

私はエラーになっている:「キャッチされない例外:DOMException:失敗実行するためには、「WebSocketを」オン「に送信」:それでも接続状態で(...)「

そして、いくつかの時間後に私は1つの以上のエラーを取得しています:」。 『WS:// localhostを:7001 /』へのWebSocket接続が失敗しました:WebSocketオープニングハンドシェイクタイムアウト "

多分このコードは間違っていますが、私は私がgoogleを見つけたすべてのものを試しました。誰かがこれで私を助けることができますか?

+0

WebSocketプロトコルは、単にポートを開くよりもはるかに複雑です。これを動作させたい場合は、サーバ側でハンドシェイクとフレーミングを実装する必要があります。おそらく 'ws'ライブラリをチェックしてください。 –

答えて

8

ブラウザからwebSocket接続を受け取ることができる独自のwebSocketサーバーを作成する場合は、サーバーにwebSocketプロトコルを実装する必要があります。単なるソケット接続ではありません。これには、セキュリティ情報の交換を含むwebSocketプロトコルに「アップグレード」されたHTTP接続として起動する起動シーケンスがあり、webSocket経由で送信されるすべてのデータのwebSocketフレーミングフォーマットがあります。 webSocketでプレーンテキストを送信するだけではありません。

webSocketプロトコルの外観は、Writing Websocket Serversです。学習目的のためだけに自分のwebSocketサーバーを作りたいのでない限り、私は本当にあなたのためのすべての根っこいプロトコルの作業を行っている既存のモジュールを取得することをお勧めします。

次に、socket.ioライブラリはwebSocketプロトコルの上に構築され、その上に追加の機能とメッセージフォーマットが追加されています。あなたのWebSocketを接続する方法のアイデアを与えることを

は、ここでは代表的な接続シーケンスです:

ブラウザが接続要求を送信します。

GET /chat HTTP/1.1 
Host: example.com:8000 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 
Sec-WebSocket-Version: 13 

Serverが応答します。次に

HTTP/1.1 101 Switching Protocols 
Upgrade: websocket 
Connection: Upgrade 
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= 

、両側を次のようなデータフレーミング形式を持つwebSocketプロトコルに切り替えます。

0     1     2     3 
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
+-+-+-+-+-------+-+-------------+-------------------------------+ 
|F|R|R|R| opcode|M| Payload len | Extended payload length | 
|I|S|S|S| (4) |A|  (7)  |    (16/64)   | 
|N|V|V|V|  |S|    | (if payload len==126/127) | 
| |1|2|3|  |K|    |        | 
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + 
|  Extended payload length continued, if payload len == 127 | 
+ - - - - - - - - - - - - - - - +-------------------------------+ 
|        |Masking-key, if MASK set to 1 | 
+-------------------------------+-------------------------------+ 
| Masking-key (continued)  |   Payload Data   | 
+-------------------------------- - - - - - - - - - - - - - - - + 
:      Payload Data continued ...    : 
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + 
|      Payload Data continued ...    | 
+---------------------------------------------------------------+ 

さらに、キープアライブテストのためのpingとpongパケットがあり、大きなパケットとフラグメンテーションのスキームがあり、クライアント/サーバーはサブプロトコルをネゴシエートできます。

+0

ありがとう!それはとても役に立ちました! –

+0

ありがとう@ jfriend00、私はnodejsネットモジュールとhttpアップグレードの間に多くの時間を費やして、サードパーティのライブラリを使用しないようにしました。あなたは答えてくれました。 –

関連する問題