読者です 読者をやめる 読者になる 読者になる

にわとりプログラマーの備忘録

覚えたことをすぐ忘れてしまう、自分のための備忘録ブログです。

C#のSocketIO4Net.Clientで"Error initializing handshake with"が発生したときの解決策

C#のwebsocketのsocketIOクライントのライブラリを使っていた際に、
node.jsで実装したサーバーに接続を試みた際、「Error initializing handshake with "http://localhost:3000"」が発生したので、その解決策をまとめておきます。

クライント側のソースコード

using SocketIOClient;
    public partial class Display : Form
    {
        SocketIOClient.Client websocket;

        public Display()
        {
            InitializeComponent();
            connect();
        }

        private void connect()
        {
            /* インスタンス生成 */
            websocket = new Client("http://localhost:3000");

            /* サーバとの接続が確定 */
            websocket.On("connect", (fn) =>
            {
                NotifyUpdateState(INROOM);
                Console.WriteLine("connect");
            });
             
            /* サーバに接続 */
            websocket.Connect();
        }
   }


サーバー側のソースコード

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

console.log('server running');

/* port:3000で待機 */
var server = http.createServer(app);
server.listen(3000, function(){
	console.log("server listening on port 3000");
});

/* socket.IOのインスタンス生成 */
var socketIO = require('socket.io');

/* クライアントの接続を待機(IPアドレスとポート番号を結び付ける) */
var io = socketIO.listen(server);

/* クライアントが接続してきたときの処理 */
io.sockets.on('connection', function(socket){
	console.log("connection");

	/* クライアントが切断したときの処理 */
	socket.on('disconnect', function(){
		console.log('disconnect');
	});
})

}

次のページに原因が書いてありました。
sockets - SocketIO4Net Handshake Error - Stack Overflow

要はnode.js側のsocket.ioのバージョン1.0.X以上では0.9.Xとはハンドシェークの手法?(プロトコル?)が異なるので、通信が確立できないらしいです。

node.jsのsocket.ioのバージョンを0.9.17にして実行したところ無事通信できました。

因みに、npmでバージョンを指定してインストールする場合は以下のようにパッケージ名の後ろに@[バージョン]で指定すれば大丈夫だそうです。

npmでバージョンを指定してパッケージをインストール

npm install socket.io@0.9.17


通信の仕組みとか全く勉強不足で分かっていないので、そこら辺も勉強していかないといけないなと感じました。
クライアント側のライブラリを変更した方がいいのかな...