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に関して、何のプロパティが存在しているのか読み取れませんでした。
ソースを追って必要そうなプロパティがなんとなく見えたので、追加してやってみているのですが、うまくいきません。
ちなみに、以下のソース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時間ほど潜ったのですが、伏魔殿だと気が付いた時にはもう、戻れなくなってロストしてしまいました。。。
やりたい事はタイトルの通りなので、どなたか、どなたか伏魔殿から僕の骨を拾って協会で復活させてください。
あなたの回答
tips
プレビュー