gpt4 book ai didi

javascript - C# WebSocket - 握手期间客户端没有响应

转载 作者:行者123 更新时间:2023-11-29 23:44:24 25 4
gpt4 key购买 nike

我正在尝试为根据浏览器输入进行交互的应用程序编写 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 token ,但是 JS - window native - WebSocket 似乎已经完全疯了:它确实无论收到什么都不回答。我希望它在发送 HTTP/1.1 400 Bad Request 时抛出错误,但什么也没有发生。它只是静音。查看 Chrome 开发工具的 Networking 选项卡,我只看到 websocket 传出 GET 请求,但没有传入数据包 - 这应该发生吗?如果我强行关闭应用程序,WebSocket 会抛出这个异常:

与“ws://localhost:42001/websocket”的 WebSocket 连接失败:WebSocket 握手期间出错:net::ERR_CONNECTION_RESET

我在这里错过了什么?提前谢谢大家。

此外,我没有使用 Net.WebSockets,因为它从 .NET 4.5 开始可用,而且我的应用程序面向从 Windows 7 到当前版本的 Windows 10 的系统。

最佳答案

好吧...您的 C# 代码能走多远?我的第一个赌注是缓冲 - 你不会刷新写入器或流,所以我期望它们在卡在 while 顶部时保留数据循环,但坦率地说,它首先不应该是一个 while 循环 - 每个套接字只能进行一次握手,而不是很多。您可以尝试在空白行之后添加刷新,并且您应该确保 Socket 本身已禁用缓冲 (NoDelay = true;) - 但是:从根本上讲,这不是编写网络套接字服务器的好方法。撇开其他不谈,如果握手成功,数据将不再是文本,因此拥有TextReader 是一件非常糟糕的事情。坦率地说,你应该在这里处理原始 Socket/byte[] 数据,IMO(已经多次实现了这个东西)。

关于javascript - C# WebSocket - 握手期间客户端没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44524182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com