我正在尝试为浏览器输入交互的应用程序编写C#WebSocket服务器。C#WebSocket - 在握手过程中客户端没有响应
这是代码:
class Program {
static void Main(string[] args) {
var listener = new TcpListener(IPAddress.Parse("127.0.0.1"), 42001);
listener.Start();
using(var client = listener.AcceptTcpClient())
using(var stream = client.GetStream())
using(var reader = new StreamReader(stream))
using(var writer = new StreamWriter(stream)) {
while (!reader.EndOfStream) {
String line = reader.ReadLine();
if (new Regex("^GET").IsMatch(line)) {
line = reader.ReadLine();
if (new Regex("^Sec-WebSocket-Key: ").IsMatch(line)) {
String key = new Regex("(^Sec-WebSocket-Key\\: |\\r\\n)").Replace(line, "");
key = Convert.ToBase64String(SHA1.Create().ComputeHash(Encoding.UTF8.GetBytes(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")));
writer.WriteLine("HTTP/1.1 101 Switching Protocols");
writer.WriteLine("Upgrade: websocket");
writer.WriteLine("Connection: Upgrade");
writer.WriteLine("Sec-WebSocket-Accept: " + key);
writer.WriteLine("Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits");
writer.WriteLine("WebSocket-Origin: http://127.0.0.1");
writer.WriteLine("WebSocket-Location: ws://localhost:42001/websocket");
writer.WriteLine("");
}
}
}
}
listener.Stop();
}
}
...和:
var ws = new WebSocket('ws://localhost:42001/websocket');
ws.onopen = function() {
console.log('connected');
};
ws.onmessage = function(e) {
console.log(e.data);
};
ws.onerror = function(e) {
console.log(e);
};
ws.onclose = function() {
console.log("closed");
};
在执行时,所述成功TPCListener接受的TcpClient并读取传入的HTTP请求。它解析Key
,生成正确的令牌Accept
,但JS-window
原生的WebSocket似乎已经变得疯狂:它无论接收到什么都不回答。 我期望它在发送HTTP/1.1 400 Bad Request
时发生错误,但完全没有任何事情发生。它只是静音。 查看Chrome Dev Tools的Networking
选项卡,我只看到websocket传出GET请求,但没有传入数据包 - 是否应该发生? 如果我强制关闭应用程序,WebSocket会抛出以下异常:
WebSocket connection to 'ws://localhost:42001/websocket' failed: Error during WebSocket handshake: net::ERR_CONNECTION_RESET
。
我在这里错过了什么?谢谢大家。
另外,我不使用Net.WebSockets
,因为它是自.NET 4.5可用,并从Windows 7到Windows 10的当前版本
您的第一个赌注非常正确,谢谢。 我没有冲洗作家和双手相当成功地震动 - 我很抱歉。我欣赏提示! – anon123
@Marc Gravell既然你已经实现了几次WebSockets,你可以看看我的文章,并提供一个代码示例?我的帖子https://stackoverflow.com/questions/47481999/c-sharp-websockets-on-windows-7-with-owin – Que