質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Node.js

    2361questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • WebSocket

    202questions

    WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。

【node.js】websocket(wss)サーバ構築

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,565

kanimaru

score 931

質問:どのように構築すればwssサーバを構築できるでしょうか。

以下のようにNodeサーバでWebSocketサーバ(wss)を組んだつもりですが
chromeで確認した際にエラーとなり接続できませんでした。

これとは別に、httpsサーバをポートを変更し並行して構築していますが
そちらはhttpsで接続できています。ただ、opensslコマンドを用いた
自己認証の証明書です。そのためChromeでは、警告が初回に出ますが
無視して接続しております。
rsa 2048bit
sha256

エラー内容:

始めはしたのエラーでした
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
が色々弄ってるうちに
ERR_CONNECTION_CLOSED
になったりしました・・・。

// サーバ
let WebSocketServer = require('websocket').server;
let https = require('http');
let port = xxxxx;// ポート番号です

let fs = require('fs');

let pkey = fs.readFileSync('xxxxx_key.pem');
let pcert = fs.readFileSync('xxxxxx_crt.pem')
let server = https.createServer(function(request, response) {
    console.log((new Date()) + ' Received request for ' + request.url);
    response.writeHead(404);
    response.end();
});


server.listen(port, function() {
    console.log((new Date()) + ' Server is listening on port'+port);
});
let wsServer = new WebSocketServer({
    httpServer: server,
    ssl: true,
    key: pkey,
    cert: pcert
});



console.log('websocket server start. port=' + port);

wsServer.on('connection', function(request) {
    console.log('-- websocket connected --');
    console.log(request.origin);
    var connection = request.accept('echo-protocol', request.origin);
    console.log(request.origin);
    connection.on('message', function(message) {
      console.log(message);
  });
});
クライアント

    let wsUrl = 'wss://domain.js:xxxxx/';// ドメインとポート番号は伏せました。
    let ws = new WebSocket(wsUrl, ['echo-protocol', "soap", "xmpp"]);
    ws.onopen = function (evt) {
        console.log('ws open()');
    };
    ws.onerror = function (err) {
        console.error('ws onerror() ERR:', err);
    };
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

+3

結論から言うと解決しました!

すみません、やってしまった感しかないんです。ほんと変な質問しました豆腐の角に
頭ぶつけて死に体レベルです。

色々認識が間違っていまして、根本的に見直しました。戒めのためにこのまま質問の
ソースは残します・・・。

ミスした理由:
・複数の資料を見ていたことによる、認識齟齬
・途中でnpmを変更したにもかかわらず、別資料ベースで組む
・npmのドキュメント読まなかった ※ダメぜったい!
・過度の飲酒はダメぜったい!

本当に利用するライブラリのマニュアル・ドキュメントはマジで読みなさい!!
だいたいサンプルコードもあるんですよ!!

以下が動作見直した動作コードです。なお、接続確立までしか載せてません。
確立後の処理は動作したので、行いたいような処理を実装すればいいかと。

// wss server

// ws 使ってるつもりでした。websocketのパッケージを利用してますね。
let WebSocketServer = require('websocket').server;
// websocket パッケージでwssってことは httpsサーバでたてないとなのに
// httpで建ててるよ何してるんだろうね
let https = require('https');
// httpサーバで待ち受けるポート番号
let port = xxxxx;


let fs = require('fs');
// SSL用のKEY
let pkey = fs.readFileSync('key');
// SSL用の証明書
let pcert = fs.readFileSync('crt');

// サーバオプション
// WEBサーバはどっちだよ?httpsで待ち受けて、そっちで
// SSL解釈するのでしょう!
let serverOptions = {
    key : pkey,
    cert : pcert
};
// カギと証明書つけてサーバ作るよ!
let server = https.createServer(
    serverOptions,
    function(request, response) {
        console.log((new Date()) + ' Received request for ' + request.url);
        response.writeHead(404);
        response.end();
});

// 指定したポートで接続待ち受けるよ!!
server.listen(port, function() {
  // 待ち受け処理出来たらコンソールに表示するよ!
    console.log((new Date()) + ' Server is listening on port'+port);
});

// サーバ立てるよ!
// sslとかその辺全部HTTPSにぽいするし!
// そもそもそんなパラメタWebSocketServer取らないし!
// マニュアルドキュメント読め!
let wsServer = new WebSocketServer({
    httpServer: server,
    // ssl: true,
    // key: pkey,
    // cert: pcert                                                                                                                                                         });


// WebSocket開いたから接続まちポート表示するよ!
console.log('websocket server start. port=' + port);

// リクエストきた時の処理書くよ!
wsServer.on("request",function(request){
  // 3うぇいはんどシェークの確立処理するよ!
    // 第一引数はプロトコルだから、フロントとあわせないと
  // 即死しちゃうゾ☆
    var connection = request.accept('echo-protocol', request.origin);
    /*
     以降にコネクション後の処理つらつらとかく。
   */
});

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Node.js

    2361questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • WebSocket

    202questions

    WebSocketとは双方向・全二重コミュニケーションのためのAPIでありプロトコルのことを指します。WebSocketはHTML5に密接に結びついており、多くのウェブブラウザの最新版に導入されています。