我是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。
感谢大家阅读并希望得到您的帮助。
答案 0 :(得分:2)
除非您使用大型二进制数据,否则您可以将JSON用作消息协议,以满足您的大多数需求。
使用JSON时,大型二进制数据需要转换为Base64,这会产生很大的开销并使网络流量膨胀。如果你正在使用二进制数据,请阅读下一节。
要使用JSON,您可以使用JSON.parse(data) // => get complex object
或JSON.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
}
}
根据您的需求和涉及的用户输入量,我会考虑使用添加到消息流开头的标识符填充每条消息。
这与上面的解决方案类似,但会创建强大的消息类型而不是推断的消息类型。