c#
  • socket.io
  • socketio4net
  • 2013-04-13 56 views 0 likes 
    0

    我正在嘗試使用SocketIO4net使用socket.io API,但似乎無法收到任何消息。在同一個VS2010解決方案中,我有一個網站,其代碼如下:在SocketIO4net中沒有收到消息

    <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相當陌生,有什麼我應該做的不同?

    +0

    可以共享socket.io服務器端的裸機片斷,我很樂意去看看(Socketio4net的作者) –

    +0

    我沒有服務器端代碼 - 我正在嘗試使用由icbit.se提供的API – Macros

    回答

    2

    問題是SocketIO4Net默認命名空間正在連接&註冊。排序的答案是在on.connect事件處理程序中做一些小改動: 爲IEndPointClient(比如icbit)添加一個新變量,並在套接字連接上連接「icbit」命名空間。

    SocketIO4Net默認的「On」處理程序也將處理名稱空間事件,或者您選擇直接向給定端點註冊它們。 (即使使用額外的名稱空間連接也可以進行單個連接)。你可以閱讀更多關於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 
          } 
         } 
        } 
    } 
    

    如果你從一個樣本HTML頁面樣本的WebSocket框架跟蹤 - 你會看到它使用的是「icbit」命名空間: orderbook_BUH3

    請參閱如果這個小的解決方法不能解決你的問題......我進一步探討爲什麼querystring params /命名空間連接和張貼在項目site

    吉姆

    +0

    感謝您的幫助 - 我已經實現了這一點並接收由SocketMessage處理程序處理的通用套接字消息(聊天日誌)。我仍然沒有看到任何消息從orderbook_BUM3的訂閱中收到,而從網頁運行時有很多消息。有什麼特別的方式我應該訂閱? – Macros

    +0

    我更新了上面的示例以顯示完整示例,這裏有什麼工作... –

    +0

    傑出!我會放棄這一點。非常感謝您的詳細幫助 – Macros

    相關問題