我是WebSocket API的初学者。我正在尝试在本地连接到我的服务器,但我正在获取连接已关闭的消息。谁能告诉我我做错了什么?
这是我的代码:
服务器
using System.Net.Sockets;
using System.Net;
using System.IO;
using System;
class Program
{
static void Main(string[] args)
{
var listener = new TcpListener(IPAddress.Loopback, 8181);
listener.Start();
while (true)
{
Console.WriteLine("Listening...");
using (var client = listener.AcceptTcpClient())
using (var stream = client.GetStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
{
string line = null, key = "", responseKey = "";
string MAGIC_STRING = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
while (line != "")
{
line = reader.ReadLine();
if (line.StartsWith("Sec-WebSocket-Key:"))
{
key = line.Split(':')[1].Trim();
}
}
if (key != "")
{
key += MAGIC_STRING;
using (var sha1 = SHA1.Create())
{
responseKey = Convert.ToBase64String(sha1.ComputeHash(Encoding.ASCII.GetBytes(key)));
}
}
// send handshake to the client
writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
writer.WriteLine("Upgrade: WebSocket");
writer.WriteLine("Connection: Upgrade");
writer.WriteLine("WebSocket-Origin: http://localhost:8080");
writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
if (!String.IsNullOrEmpty(responseKey))
writer.WriteLine("Sec-WebSocket-Accept: " + responseKey);
writer.WriteLine("");
Console.ReadLine();
writer.Flush();
}//using
Console.WriteLine("Finished");
}//while
}
}
客户
<!DOCTYPE HTML>
<html>
<head><title></title>
<script type="text/javascript">
function WebSocketTest() {
var msg = document.getElementById("msg");
if ("WebSocket" in window) {
msg.innerHTML="WebSocket is supported by your Browser!";
// Let us open a web socket
var ws = new WebSocket("ws://localhost:8181/websession");
ws.onopen = function () {
// Web Socket is connected, send data using send()
msg.innerHTML="connection open";
//ws.send("Message to send");
//msg.innerHTML="Message is sent...";
};
ws.onclose = function () {
// websocket is closed.
msg.innerHTML = "Connection is closed...";
};
ws.onerror = function(error){
console.log('Error detected: ' + error);
};
ws.onmessage = function (evt) {
var received_msg = evt.data;
msg.innerHTML="Message is received...";
};
}
else {
// The browser doesn't support WebSocket
msg.innerHTML="WebSocket NOT supported by your Browser!";
}
}
</script>
</head>
<body>
<div id="sse">
<a href="javascript:WebSocketTest()">Run WebSocket</a><br />
<p id="msg"></p>
</div>
</body>
</html>
任何解决方案都将不胜感激,谢谢:)
答案 0 :(得分:0)
在任何规范下,这都不是有效的Web套接字响应。最初的Web套接字响应总是要求您将一些数字作为响应头的一部分来处理,以证明您是一个Web套接字服务器。要读取和写入的标头以及要执行的操作取决于Web套接字的版本(hibi / hixie 76 / rfc)。实际上,您的服务器正在使用客户端的标头。
例如,RFC6455(13)响应将开始:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: {crunch some numbers}
请注意,Hixie-76响应不同,上面的部分我省略了。
为了证明握手已经收到,服务器必须拿两个 信息片段并将它们组合起来以形成响应。首先 信息来自| Sec-WebSocket-Key |标题字段 在客户端握手中:
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
对于此标头字段,服务器必须取值(如中所示) 标题字段,例如base64编码的[RFC4648]版本减去任何 前导和尾随空格)并将其连接到 全球唯一标识符(GUID,[RFC4122])“258EAFA5-E914-47DA- 95CA-C5AB0DC85B11“字符串形式,不太可能被使用 不了解WebSocket协议的网络端点。一个 SHA-1哈希(160位)[FIPS.180-3],base64编码(参见第4节) [RFC4648]),然后在服务器中返回此连接 握手。
答案 1 :(得分:0)
javascript代码连接到网络服务器后。 C#遍历所有using语句并将所有行打印到文件中,之后关闭所有using语句,从而处理生成的客户端,从而关闭连接。
针对此问题的快速(但很脏)修复是在using语句的末尾添加“Console.Readline”。不过要小心,你的过程会挂起!
有关接受客户端的TcpClients的更多信息,请转至msdn。
请注意,那里给出的示例,一次只允许一个连接
最后一点:存在用于接受像Marc建议的websocket连接的库。