WebSocket的服务器,客户端不能握手 [英] Websocket server, client can't handshake

查看:168
本文介绍了WebSocket的服务器,客户端不能握手的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是最新版本的Chrome(WebSocket的版本13)测试

I'm testing using the latest version of Chrome (websocket version 13).

下面是位于 HTTP我简单的客户端页面:/ /127.0.0.1/folder/default.aspx

<script type="text/javascript">
    var socket = new WebSocket('ws://localhost:8181/websession');
    socket.onopen = function () {
        alert('handshake successfully established. May send data now...');
    };
    socket.onclose = function () {
        alert('connection closed');
    };
    socket.onmessage = function(msg) {
        alert(msg);
    };
</script>



这是我的听众(C#)

And here's my listener (c#)

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))
    {
        writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
        writer.WriteLine("Upgrade: WebSocket");
        writer.WriteLine("Connection: Upgrade");
        writer.WriteLine("WebSocket-Origin: http://127.0.0.1");
        writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
        writer.WriteLine("");
    }
    Console.WriteLine("Finished");
}

当我运行服务器,然后加载客户端页面,只说关闭连接

When I run the server, and then load the client page it only says "connection closed".

可能有人请告诉我如何得到这个握手正确执行?至于我可以从文档和前面的问题告诉,我送回到客户端的响应看起来是正确的。

Could someone please tell me how to get this handshake performing correctly? As far as I can tell from documentation and previous questions, the response I'm sending back to the client looks correct.

推荐答案

基于您的代码,这应该工作(至少铬)

Based on your code ,this should work (at least with chrome)

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://127.0.0.1");
        writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
        if (!String.IsNullOrEmpty(responseKey)) 
            writer.WriteLine("Sec-WebSocket-Accept: " + responseKey);
        writer.WriteLine("");

        writer.Flush();

        SendString(stream, "This code works!!!!");
        SendString(stream, "This code also works!!!! ".PadRight(300, '.') + "\r\nEND");
    }
    Console.WriteLine("Finished");
}


void SendString(Stream s, string str)
{
    var buf = Encoding.UTF8.GetBytes(str);
    int frameSize = 64;

    var parts = buf.Select((b, i) => new { b, i })
                   .GroupBy(x => x.i / (frameSize - 1))
                   .Select(x => x.Select(y => y.b).ToArray())
                   .ToList();

    for (int i = 0; i < parts.Count; i++ )
    {
        byte cmd = 0;
        if (i == 0) cmd |= 1;
        if (i == parts.Count - 1) cmd |= 0x80;

        s.WriteByte(cmd);
        s.WriteByte((byte)parts[i].Length);
        s.Write(parts[i], 0, parts[i].Length);
    }

    s.Flush();
}



PS:使用

PS: Use

socket.onmessage = function(msg) {
    alert(msg.data);
};



看到服务器发送消息的内容。

to see the content of message sent by the server.

这篇关于WebSocket的服务器,客户端不能握手的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆