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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Q&A

0回答

3585閲覧

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

iyasaka

総合スコア6

Node.js

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

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

0グッド

1クリップ

投稿2018/09/16 00:41

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時間ほど潜ったのですが、伏魔殿だと気が付いた時にはもう、戻れなくなってロストしてしまいました。。。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問