Websocket:Javascript客户端未确认收到C#发送的数据帧。握手完全有效,客户端可以向服务器发送消息

时间:2018-08-07 18:39:57

标签: javascript c# websocket server client

我希望您能帮助解决我的websocket问题-请注意,我对websocket和javascript非常陌生。

我的客户端和服务器都正确握手了,客户端可以将消息发送到服务器,并且我编写的代码正确解码了消息。问题是,尽管我相信我已经正确地构造了从服务器到客户端的文本消息的数据帧,但是当我将数据帧写入流时,客户端不会使用“ onmessage”事件来确认消息。我正在同一台计算机上的google chrome上使用一个简单的html网页进行测试-IP都正确并且可以正常使用。下面是我用来向客户端发送消息的代码...

                       TcpListener Server = new TcpListener(IPAddress.Parse("192.168.1.190"), 555);
        Server.Start();
        Console.WriteLine("Server started, waiting for connection...");
        TcpClient Client = Server.AcceptTcpClient();
        Console.WriteLine("A client connected.");
        String data = "";
        NetworkStream stream = null;
        while (data == "")
        {
            Thread.Sleep(1000);
            stream = Client.GetStream();
            Byte[] bytes = new Byte[Client.Available];
            stream.Read(bytes, 0, bytes.Length);
            //translate bytes of request to string
            data = Encoding.UTF8.GetString(bytes);
            Console.WriteLine(data);
        }
        if (new System.Text.RegularExpressions.Regex("^GET").IsMatch(data))
        {
            const string eol = "\r\n"; // HTTP/1.1 defines the sequence CR LF as the end-of-line marker
            Byte[] response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + eol
                + "Connection: Upgrade" + eol
                + "Upgrade: websocket" + eol
                + "Sec-WebSocket-Accept: " + Convert.ToBase64String(
                    System.Security.Cryptography.SHA1.Create().ComputeHash(
                        Encoding.UTF8.GetBytes(
                            new System.Text.RegularExpressions.Regex("Sec-WebSocket-Key: (.*)").Match(data).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
                        )
                    )
                ) + eol
                + eol);
            Console.WriteLine(Encoding.UTF8.GetString(response));
            stream.Write(response, 0, response.Length);
            Byte[] Testmsg = FormTextFrame("TEST MESSAGE");
            Thread.Sleep(2000);
            stream.Write(Testmsg, 0, Testmsg.Length);

在接收方客户端上,这是我拥有的代码...

        var exampleSocket = null
        var button1 = document.getElementById('Button1')
        var button2 = document.getElementById('Button2')
        button1.onclick = function() {
            exampleSocket = new WebSocket("ws://192.168.1.190:555");
        }
        button2.onclick = function() {
            alert(exampleSocket.readyState);
            exampleSocket.send("This is a test message");
        }
        exampleSocket.onmessage = function(evt) {
            MyImage.setAttribute('src', 'images/p1.jpg');
        }
        exampleSocket.onopen = function(event)
        {
        alert();
        }

但是,我在客户端没有收到任何警报。我不知道就事件驱动功能而言,我是否在javascript方面缺少任何东西。 This is the article我一直在用于开发javascript客户端。 我使用了RFC6455规范和developer.mozilla的这两篇文章; article 1article 2。我在这里细读了几个问题,提到了我遇到的同一问题,但据我所知,没有一个答案。

这是我的格式化代码,用于格式化测试消息的数据框...

    private static Byte[] FormTextFrame(string Text)
    {
        ////FOR NOW ASSUMES PAYLOAD LENGTH < 128
        uint FirstByte = 129;
        uint Payload = Convert.ToUInt16(Text.Length);
        Byte[] ReturnVal = new Byte[2 + Payload];
        Byte[] TextBytes = System.Text.Encoding.UTF8.GetBytes(Text);
        ReturnVal[0] = Convert.ToByte(FirstByte);
        ReturnVal[1] = Convert.ToByte(Payload);
        for (int i = 0; i < Payload; i++)
        {
            ReturnVal[2 + i] = TextBytes[i];
        }
        return ReturnVal;
    } 

据我所见,这产生了一个正确格式的字节数组用于发送,与从客户端接收到的消息减去掩码大致相同。我正在使用固定的uint值129,因为这会根据文本传输所需的websocket规范提供位模式。我只使用字符串的长度来定义有效负载长度,因为每个字符都是一个字节,并带有服务器->客户端消息,据我所知,有效负载应被屏蔽,因此,您无需添加128即可得出最后一个有效负载大小八位位组。

我真的很感激任何人对此有所启发,因为我整天都在摸索如何解决这个问题!我知道有预编译的库,但是由于我对功能的简单要求,我希望自己编写它,以便更好地了解它的工作方式。

非常感谢! 鲁珀特

0 个答案:

没有答案