创建websocket服务器以使用SuperWebSocket

时间:2015-11-23 19:10:37

标签: javascript c# websocket

我是websocket服务器的新手,如果我的问题看起来与你们中的某些人不相关或太容易,我很抱歉。

我正在使用Superwebsocket在c#中创建一个websocket服务器。 我已经设置了所有需要获取浏览器和websocket服务器之间的连接,根据他们可以找到的样本here

我有一个控制台应用程序,如下所示,它将作为websocket服务器:

 class Program
    {
        static void Main(string[] args)
        {

            var appServer = new WebSocketServer();
            //Setup the appServer
            if (!appServer.Setup(2012)) //Setup with listening port
            {
                Console.WriteLine("Failed to setup!");
                Console.ReadKey();
                return;
            }

           appServer.NewMessageReceived += new SessionHandler<WebSocketSession, string>(appServer_NewMessageReceived);
           Console.WriteLine();

            //Try to start the appServer
            if (!appServer.Start())
            {
                Console.WriteLine("Failed to start!");
                Console.ReadKey();
                return;
            }

            Console.WriteLine("The server started successfully, press key 'q' to stop it!");

            while (Console.ReadKey().KeyChar != 'q')
            {
                Console.WriteLine();
                continue;
            }
            appServer.Stop();
            Console.WriteLine();
            Console.WriteLine("The server was stopped!");
            Console.ReadKey();
        }



        static void appServer_NewMessageReceived(WebSocketSession session, string message)
        {
            //Send the received message back
            session.Send("Server: " + message);
        }
    }

我有一个示例html文件,它将作为websocket服务器使用者,服务器连接/断开服务器的所有java脚本代码如下:

 <script type="text/javascript">
        var ws;

        function connectToWebsocket() {
            ws = new WebSocket('ws://localhost:2012/');
            // when data is comming from the server, this metod is called
            ws.onmessage = function(evt) {
               //mesage received
            };

            // when the connection is established, this method is called
            ws.onopen = function() {
               // jQuery("#connectionStatus").html("Connected!");
            };

            // when the connection is closed, this method is called
            ws.onclose = function() {
               // jQuery("#connectionStatus").html("Not Connected!");
            }
        }

        ///send message toolbarexample websocket server
        function sendMessage() {
            if (ws) {
                ws.send("Some text");
            }
        }

        function disconnectWebSocket() {
            if (ws) {
                ws.close();
            }
        }
    </script>

现在一切正常,我握手成功,所以我发送和接收字符串消息。

现在我有一个很大的误解,我想理解:

假设我希望能够在这个websocket服务器中执行两个命令,例如,我希望能够发送字符串消息和发送复杂对象的另一种可能性,以防万一字符串消息是从我想要的javascript发送的要在websocket服务器上触发的appServer_NewMessageReceived方法,但在其他情况下,我希望触发另一个方法,如complexObjectWasReceived(WebSocketSession session, Prsone(type of object) object),同样我希望能够将命令从websocket服务器发送到浏览器到不同的方法不仅仅是onMessage函数。

我无法找到任何可以做类似事情的好例子,所有例子都是发送/接收短信,如果有人可以解释我是如何实现这一点的,我将非常感激或者提供一些很好的链接,我可以找到我需要的东西。

//注意:我希望这个websocket服务器在本地为每个用户工作,它将作为浏览器和将安装在用户机器上的一个设备之间的桥梁,该用户机器将基于读取/写入磁卡从浏览器发送的命令。

**更新:**我上传了一个包含以上所有代码的示例解决方案,您可以找到它here

感谢大家阅读并希望得到您的帮助。

1 个答案:

答案 0 :(得分:2)

除非您使用大型二进制数据,否则您可以将JSON用作消息协议,以满足您的大多数需求。

使用JSON时,大型二进制数据需要转换为Base64,这会产生很大的开销并使网络流量膨胀。如果你正在使用二进制数据,请阅读下一节。

要使用JSON,您可以使用JSON.parse(data) // => get complex objectJSON.stringify(complex_object) // => get string

通常,JSON对象是一个哈希映射(字典)对象,允许您设置数据的消息字段。

您可以在JSON消息中使用标识符来选择正确的操作。

请记住您需要将对象编码为JSON,然后才能通过websocket从服务器或客户端发送它。

ws.onmessage = function(evt) {
   msg = JSON.stringify(evt.data);
   switch(msg['msg']) {
      case 'chat':
         // do something with chat data. i.e.:
         console.log("chat from " + msg['from'] +
             ": " + msg['data']);
         break
      case 'update':
         // do something with chat data. i.e.:
         console.log("update object" + msg['id'] +
             " to be: " + msg['data']);
         break
      case 'echo':
         // do something with chat data. i.e.:
         data.ack = 1
         ws.send(JSON.stringify(data) );
         break
      // ... and so on
   }
};

如果需要移动大量二进制数据,可以使用消息的第一个字符来控制接收(或发送)的消息类型。

在伪代码中(我将它看起来像javascript,但它也应该在服务器端复制):

ws.onmessage = function(e) {
   var data = e.data
   if(data[0] == "{") // is JSON {
      // regular strings in this example cannot(!) use the "\{"
      // character as a first character, as this is reserved for JSON
      // identification
      data = JSON.parse(data);
   } else if (data.charCodeAt(0) == 0) { // is binary!
      // binary data in this example starts with 1 null character padding,
      // null padding is used to signify data type and should be removed.
      data = data.slice(1);
   } else // is string!
      data = data
   }
}

根据您的需求和涉及的用户输入量,我会考虑使用添加到消息流开头的标识符填充每条消息。

这与上面的解决方案类似,但会创建强大的消息类型而不是推断的消息类型。