1

SocketIO4net を使用して socket.io API を使用しようとしていますが、メッセージを受信できないようです。同じ VS2010 ソリューションに、次のコードを含む Web サイトがあります。

<script src="https://api.icbit.se/socket.io/socket.io.js"></script>
<script src='https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js'></script>
<script>
    $(document).ready(function () {
        var conn = io.connect('http://api-url');

        conn.on('connect', function () {
            alert('Connected');
            conn.emit('message', { op: 'subscribe', channel: 'orderbook_BUM3' });
        });

        conn.on('message', function (data) {
            console.log('Incoming message: ' + data.private);
        });
    });
</script>

これは正常に機能し、API に接続してメッセージを受信できます。次に、次のコードを入れた SocketIO4Net ライブラリとテスト プロジェクトを用意します。

  socket = new Client(http://api-url); // url to the nodejs / socket.io instance

  socket.Opened += SocketOpened;
  socket.Message += SocketMessage;
  socket.SocketConnectionClosed += SocketConnectionClosed;
  socket.Error += SocketError;

  // register for 'connect' event with io server
  socket.On("connect", (fn) =>
  {
      socket.Emit("message", new { op = "subscribe", channel = "orderbook_BUM3"
      });
  });
  socket.On("message", (data) =>
  {
      Console.WriteLine("message received");
  });

  // make the socket.io connection
  socket.Connect();

これにより接続され、成功が通知されますが、メッセージが受信されないか、エラー メッセージが出力されます。私は Socket.IO にかなり慣れていませんが、別の方法で行うべきことはありますか?

4

1 に答える 1

3

問題は、SocketIO4Net が接続および登録しているデフォルトの名前空間です。並べ替えの答えは、on.connect イベント ハンドラーを少し変更することです。IEndPointClient (icbit など) の新しい変数を追加し、ソケット接続で "icbit" 名前空間に接続します。

SocketIO4Net の既定の "On" ハンドラーは、名前空間イベントも処理するか、特定のエンドポイントに直接登録することを選択します。(追加のネームスペース接続でも、単一の接続が確立されます)。SO4N名前空間について詳しく読むことができます

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using SocketIOClient;
using WebSocket4Net;

namespace Console_ICBIT
{
    public class SampleClient
    {
        private Client socket;
        private IEndPointClient icbit;

        private string authKey = "{your key here}";
        private string userId = "{your user id here}";

        public void Execute()
        {
            Console.WriteLine("Starting SocketIO4Net Client Events Example...");
            string ioServer = string.Format("https://api.icbit.se/icbit?AuthKey={0}&UserId={1}", authKey, userId);
            socket = new Client(ioServer);

            socket.Opened += SocketOpened;
            socket.Message += SocketMessage;
            socket.SocketConnectionClosed += SocketConnectionClosed;
            socket.Error += SocketError;


            // register for 'connect' event with io server
            socket.On("connect", (fn) =>
                                     {      // connect to namespace
                                         icbit = socket.Connect("/icbit");
                                         icbit.On("connect", (cn) => icbit.Emit("message", new { op = "subscribe", channel = "orderbook_BUM3" }));
                                     });

            // make the socket.io connection
            socket.Connect();
        }

        void SocketOpened(object sender, EventArgs e)
        {
            Console.WriteLine("SocketOpened\r\n");
            Console.WriteLine("Connected to ICBIT API server!\r\n");
        }
        public void subscribe()
        {
            //conn.Emit("message", new { op = "subscribe", channel = "orderbook_BUH3" }); // for BTCUSD futures
            //conn.Emit("message", "{op = 'subscribe', channel = 'orderbook_3' }"); //  for currency exchange section BTC/USD pair
        }
        void SocketError(object sender, ErrorEventArgs e)
        {
            Console.WriteLine("socket client error:");
            Console.WriteLine(e.Message);
        }

        void SocketConnectionClosed(object sender, EventArgs e)
        {
            Console.WriteLine("WebSocketConnection was terminated!");
        }

        void SocketMessage(object sender, MessageEventArgs e)
        {
            // uncomment to show any non-registered messages
            if (string.IsNullOrEmpty(e.Message.Event))
                Console.WriteLine("Generic SocketMessage: {0}", e.Message.MessageText);
            else
                Console.WriteLine("Generic SocketMessage: {0} : {1}", e.Message.Event, e.Message.Json.ToJsonString());
        }
        public void Close()
        {
            if (this.socket != null)
            {
                socket.Opened -= SocketOpened;
                socket.Message -= SocketMessage;
                socket.SocketConnectionClosed -= SocketConnectionClosed;
                socket.Error -= SocketError;
                this.socket.Dispose(); // close & dispose of socket client
            }
        }
    }
}

サンプルの html ページ サンプルから websocket フレーム トレースを見ると、"icbit" 名前空間を使用していることがわかります。 orderbook_BUH3

この小さな回避策で問題が解決しないかどうかを確認してください...クエリ文字列のパラメーター/名前空間の接続の理由をさらに調べて、プロジェクトサイトに投稿します。

ジム

于 2013-04-14T17:26:43.997 に答える