3

nodejsで非常に単純なWebSocketサーバーを作成しようとしていますが、問題が発生しています。ブラウザでは、WebSocket.onclose関数が起動される唯一の関数です(onopen、onmessage、およびonerrorは起動されません)。Chrome7とFireFox4でテストしました。これが私のサーバーコードです:

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

var server = http.createServer(function(req、res){
 console.log(req);
});

server.on('connection'、function(stream){
 stream.setEncoding('utf8');
 stream.setTimeout(0);
 stream.setNoDelay(true);
 stream.on('data'、function(data){
  var sec1_regex = /Sec-WebSocket-Key1:(.*)/g;
  var sec2_regex = /Sec-WebSocket-Key2:(.*)/g;
  var origin_regex = / Origin:(。*)/ g;
  var protocol_regex = / Sec-WebSocket-プロトコル:(。*)/ g;

  console.log(stream);
  console.log("****着信****\ r \ n" +データ);
  var key1 = sec1_regex.exec(data)[1];
  var num1 = parseInt(key1.match(/ \ d / g).join(''))/(key1.match(/ \ s / g).length-1);
  console.log( "num1:" + num1);
  var key2 = sec2_regex.exec(data)[1];
  var num2 = parseInt(key2.match(/ \ d / g).join(''))/(key2.match(/ \ s / g).length-1);
  console.log( "num2:" + num2);
  var lastbytes = data.slice(-8);
  var origin = origin_regex.exec(data)[1];

  var md5 = crypto.createHash('md5');
  md5.update(String.fromCharCode(num1 >> 24&0xFF、num1 >> 16&0xFF、num1 >> 8&0xFF、num1&0xFF));
  md5.update(String.fromCharCode(num2 >> 24&0xFF、num2 >> 16&0xFF、num2 >> 8&0xFF、num2&0xFF));
  md5.update(lastbytes);
  var response = "HTTP / 1.1101WebSocketプロトコルハンドシェイク\r\ nアップグレード:WebSocket \ r \ n接続:アップグレード\ r \ nSec-WebSocket-Origin:"
   +オリジン+"\r \ nSec-WebSocket-場所:ws://127.0.0.1:8124 / \ r \ n" +
      md5.digest('binary');
  stream.write(response、'binary');
  console.log("****送信****\ r \ n" +応答);
 });
});

server.listen(8124、 '127.0.0.1');

そして私のクライアントコード:

  関数connect(){
   if(window.WebSocket){
    試す {
     ws = new WebSocket('ws://127.0.0.1:8124');
     ws.onopen = function(){
      alert( "open");
     };
     ws.onclose = function(){
      alert( "close");
     };
     ws.onerror = function(err){
      alert( "err!");
     };
     ws.onmessage = function(){
      alert('メッセージ');
     };
    } catch(ex){
     alert(ex);
    }
   }
  }
 
4

2 に答える 2

5

ここでいくつか問題があります。oncloseハンドルだけが起動される理由は、ブラウザが有効なハンドシェイクを受信せず、接続を終了するためです。

  1. 常に場所として送信ws://127.0.0.1:8124/します。場所は、ブラウザがリクエストで送信するものと正確に一致する必要があります。この場合、最も可能性が高いlocalhost:8124ため、そのような場合に返す必要がありますws://localhost:8124/

  2. 応答ヘッダーの後に別\r\nのものがないため、実際には本文を送信していません。

  3. ハッシュ値の計算に何か問題があるようですが、まだ原因を突き止めようとしています

動作する (そしてかなり小さい) 実装については、こちらを参照してください:
http://github.com/BonsaiDen/NodeGame-Shooter/blob/master/server/ws.js

于 2010-09-03T16:15:56.093 に答える
1

http サーバーのアップグレード イベントをリッスンできます。

それが好きです:

httpserver.onupgrade = function(request, socket) {
var key = request.headers['sec-websocket-key'];
key = require('crypto').createHash('sha1').update(key+"258EAFA5-E914-47DA-95CA-C5AB0DC85B11").digest('base64');

var sResponse = "HTTP/1.1 101 Switching Protocols\r\n" +
    "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n" +
    "Sec-WebSocket-Accept: " + key + "\r\n\r\n";
    socket.write(sResponse,'ascii');

//...
}
于 2012-09-20T17:27:44.363 に答える