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

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

ただいまの
回答率

89.09%

Node.js httpsのサーバへsocket.io-clientを使用して文字列を送信したい

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 1,885

iyasaka

score 6

 Node.js httpsのサーバへsocket.io-clientを使用して文字列を送信したい

やりたい事はタイトルの通りです。

ググって調べたところ、httpで起動しているnode.jsのサーバへはアクセスできている記事だけしか見つかりませんでした。httpsで起動しているサーバへアクセスしている記事等にはたどり着けませんでした。。。(´・ω・`)ウゥ
なので、質問した次第です。

動作環境の構成は以下の通りです。

 Node.js のサーバ側

var express = require('express');
var app = express();

//クロスサイト制限を外す設定
var cors = require('cors');
app.use(cors());

app.get('/', function(req, res) {
    res.render('index.ejs', {
        layout : false
    });
});

//設定ファイルの読み込み
require('dotenv').config();

//SSL サーバ作成
var https = require('https');
var fs = require('fs');
var ssl_server_key = '../../ssl/server.key';
var ssl_server_crt = '../../ssl/server.crt';
var options = {
        key: fs.readFileSync(ssl_server_key),
        cert: fs.readFileSync(ssl_server_crt),
        passphrase: process.env.HTTPS_PASS
};
var server = https.createServer(options, app);

//socket.ioインスタンス作成
var socketIo = require('socket.io')();
var io = socketIo.listen(server);

//socket.ioスケールアウト
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));

//スケールアウトの為sessionの共有
var cookieParser = require('cookie-parser')();
var session = require('cookie-session')({ secret: 'secret key'});
io.use(function(socket, next) {
    var req = socket.request;
    var res = {};
    cookieParser(req, res, function(err) {
        if(err) return next(err);
        session(req, res, next);
    });
});

//サーバ起動
server.listen(30000,function(){
    console.log('Start https server port:30000');
});

//名前空間作成
var io_name = io.of("/namehoge");

//処理を設定
io_name.on('connection', function(client) {
    client.on('message', function(msg) {
        client.send(msg);
        client.broadcast.emit('message', msg);
    });
});

 
※以降は、'サーバ' と呼びます。

このソースで起動したサイトにアクセスすると簡易的なチャットが表示されます。
このチャットは正常に動作しています。

やりたい事は、このhttpsで起動しているサーバに対して、別のnode.jsから'message'を送信したいのですが、送信できない状態です。これを送信できるようにしたいです。

以下の通り試しにsocket.io-clientを利用して、プログラムを作って実行してみたのですが、connectが実行されません。何かのエラーでconnectが出来ていないのだと思います。
その為、connectに記載したメッセージを送信する処理が動きません。

 別のnode.jsのソース

//設定ファイルの読み込み
require('dotenv').config();

var fs = require('fs');
var ssl_server_key = '../../ssl/new_server.key';
var ssl_server_crt = '../../ssl/server.crt';
var options = {
    key: fs.readFileSync(ssl_server_key),
    cert: fs.readFileSync(ssl_server_crt),
    pfx: fs.readFileSync(ssl_server_crt),
    passphrase: process.env.HTTPS_PASS
};

//socket.io-clientでサーバへ接続
var client = require('socket.io-client');
var socket = client.connect('https://localhost:30000/namehoge',options);

//処理
//connectしたら'how are you?'とメッセージを送信する
socket.on('connect',function(){
    console.log('yea!!');
    socket.send('how are you?');
    socket.disconnect();
    process.exit(0);
});


※以降は、'クライアント' と呼びます。

クライアント側で使用している'socket.io-client'のソースを追ってみたところ、ソース内でhttpsを使用してサーバへアクセスする時に、エラーwrong tagが発生していました。

おそらく、クライアント側の以下の部分で、clientへconnectしている時のoptions設定が足りないのだと予想しています。

var socket = client.connect('https://localhost:30000/namehoge',options);

githubに載っているsocket.io-clientのdocを読んでも、optionsに関して、何のプロパティが存在しているのか読み取れませんでした。

socket.io-clientのドキュメント リンク

ソースを追って必要そうなプロパティがなんとなく見えたので、追加してやってみているのですが、うまくいきません。

ちなみに、以下のソースhttpsを使用してサーバへアクセスしていました。

xmlhttprequest-ssl/lib/XMLHttpRequest.js
以下のソースは部分的に抜粋しています。

    :
    :

  /**
   * Private variables
   */
  var self = this;
  var http = require('http');
  var https = require('https');

    :
    :
    var options = {
      host: host,
      port: port,
      path: uri,
      method: settings.method,
      headers: headers,
      agent: agent
    };

    if (ssl) {
      options.pfx = opts.pfx;
      options.key = opts.key;
      options.passphrase = opts.passphrase;
      options.cert = opts.cert;
      options.ca = opts.ca;
      options.ciphers = opts.ciphers;
      options.rejectUnauthorized = opts.rejectUnauthorized;
    }

    :
    :
    // Handle async requests
    if (settings.async) {
      // Use the proper protocol
      var doRequest = ssl ? https.request : http.request;

    :
    :
    }

    :
    :
      // Create the request
      request = doRequest(options, responseHandler).on('error', errorHandler);

    :

上記の部分で、エラー内容をコンソールへ出力するようにしてみました。

      // Create the request
      request = doRequest(options, responseHandler).on('error', errorHandler);


      // Create the request
      try{
        request = doRequest(options, responseHandler).on('error', errorHandler);
      }catch(e){
        console.log('XMLHttpRequest.js :e=' + e);
      }

そうすると、以下のように出力されました。

XMLHttpRequest.js :e=wrong tag

と、こんな感じで10時間ほど潜ったのですが、伏魔殿だと気が付いた時にはもう、戻れなくなってロストしてしまいました。。。

やりたい事はタイトルの通りなので、どなたか、どなたか伏魔殿から僕の骨を拾って協会で復活させてください。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

まだ回答がついていません

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

  • ただいまの回答率 89.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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