1

I am attempting to consume a socket.io API using SocketIO4net however cannot seem to receive any messages. In the same VS2010 solution, I have a website with the following code:

<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>

This works fine and can connect to the API and receive messages. I then have the SocketIO4Net library and test project which I have put the following code into:

  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();

This connects and informs me of success however no messages are being received, or any error messages output. I'm fairly new to Socket.IO, is there anything I should be doing differently?

Macros
  • 7,099
  • 2
  • 39
  • 61
  • Can you share the bare-bones snippet of the socket.io server side, and I'd be happy to take a look (author of Socketio4net) – Jim Stott Apr 13 '13 at 22:38
  • I don't have the server side code - I am trying to consume the API provided by icbit.se – Macros Apr 14 '13 at 08:46

1 Answers1

3

The issue is the default namespace SocketIO4Net is connecting & registering with. The sort answer is to make a small change in the on.connect event handler: Add a new variable for a IEndPointClient (say icbit), and on the socket connection, connect with the "icbit" namespace.

The SocketIO4Net default "On" handlers will handle namespace events as well, or you choose to register them directly with the given endpoint. (A single connection is made even with the additional namespace connection). You can read more about SO4N namespace

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
            }
        }
    }
}

If you look at a websocket frame trace from a sample html page sample - you'll see it is using the "icbit" namespace: orderbook_BUH3

Please see if this small workaround doesn't fix you up...I look further into why the querystring params / namespace connection and post that on the project site.

Jim

Jim Stott
  • 810
  • 8
  • 10
  • Thanks for the help - I've implemented this and receive the generic socket message (the chat log) which is handled by the SocketMessage handler. I'm still not seeing any messages being received from the subscription to orderbook_BUM3, whereas there are lots when running from the webpage. Is there a particular way I should be subscribing? – Macros Apr 17 '13 at 22:41
  • Outstanding! I'll give this a go. Thanks a lot for the detailed help – Macros Apr 19 '13 at 20:50