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