创建websocket服务器以使用SuperWebSocket发送/接收复杂对象

本文关键字:复杂 对象 发送 SuperWebSocket 服务器 websocket 创建 | 更新日期: 2023-09-27 18:23:56

我是websocket服务器的新手,如果我的问题对你们中的一些人来说不相关或太简单,我很抱歉。

我正在使用Superwebsocket在c#中创建一个websocket服务器。我已经设置了所有需要获得浏览器和websocket服务器之间的连接的示例,可以在这里找到:

我有一个控制台应用程序如下,将作为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发送的,我希望appServer_NewMessageReceived方法在websocket服务器上激发,但在其他情况下,我希望另一个方法像complexObjectWasReceived(WebSocketSession session, Prsone(type of object) object)一样激发,以同样的方式,我希望能够将命令从websocket服务器发送到浏览器不同的方法,而不仅仅是onMessage函数。

我找不到任何可以做到这一点的好例子,所有的例子都是发送/接收短信,如果有人能解释我如何实现这一点,或者提供一些好的链接,让我找到我需要的东西,我将不胜感激。

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

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

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

创建websocket服务器以使用SuperWebSocket发送/接收复杂对象

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

使用JSON时,大型二进制数据需要转换为Base64,这会产生大量开销并增加网络流量。如果您使用二进制数据,请阅读下一节。

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

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

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

请记住在从服务器或客户端通过websocket发送对象之前,您需要将对象编码为JSON。

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

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

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