创建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服务器能为每个用户在本地工作,它将作为浏览器和安装在用户机器上的一个设备之间的桥梁,该设备将根据浏览器发送的命令读取/写入磁卡
**更新:**我上传了一个包含以上所有代码的示例解决方案,您可以在这里找到它。
感谢大家的阅读,并希望您的帮助。
您可以使用JSON作为消息协议来满足大多数需求,除非您使用的是大型二进制数据。
使用JSON时,大型二进制数据需要转换为Base64,这会产生大量开销并增加网络流量。如果您使用二进制数据,请阅读下一节。
要使用JSON,可以使用JSON.parse(data) // => get complex object
或JSON.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
}
}
根据您的需要和涉及的用户输入量,我会考虑在每条消息流的开头添加一个标识符来填充每条消息。
这与上面的解决方案类似,但会创建强消息类型,而不是推断的消息类型。