簡體   English   中英

C#WebSocket服務器未觸發html5中的onmessage事件

[英]C# websocket server not firing the onmessage event in html5

也許我現在急需幫助。

我目前在使用c#和HTML5的websocket服務器方面遇到問題。 它沒有觸發html5中的onmessage()事件。 它打開套接字連接並觸發onopen()事件。 但是,一旦建立連接,它將繼續關閉連接。 這是我的簡單代碼:

服務器(c#):

using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Security.Cryptography;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        public Socket ListenerSocker { get; private set; }
        static IPEndPoint ipLocal;
        static Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        static private string guid = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";

        static void Main(string[] args)
        {
            serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8080));
            //serverSocket.Listen(128);
            serverSocket.Listen(200);
            serverSocket.BeginAccept(null, 0, OnAccept, null);

            Console.Read();
        }


        private static void OnClientConnect()
        {

            serverSocket.BeginAccept(null, 0, OnAccept, null);
        }







        private static void OnAccept(IAsyncResult result)
        {
            byte[] buffer = new byte[1024];

            Socket client = null;
            string headerResponse = "";
            if (serverSocket != null && serverSocket.IsBound)
            {
                client = serverSocket.EndAccept(result);
                var i = client.Receive(buffer);
                headerResponse = (System.Text.Encoding.UTF8.GetString(buffer)).Substring(0, i);
                // write received data to the console
                Console.WriteLine(headerResponse);

            }
            if (client != null)
            {
                /* Handshaking and managing ClientSocket */

                var key = headerResponse.Replace("ey:", "`")
                          .Split('`')[1]                     // dGhlIHNhbXBsZSBub25jZQ== \r\n .......
                          .Replace("\r", "").Split('\n')[0]  // dGhlIHNhbXBsZSBub25jZQ==
                          .Trim();

                // key should now equal dGhlIHNhbXBsZSBub25jZQ==
                var test1 = AcceptKey(ref key);

                var newLine = "\r\n";

                var response = "HTTP/1.1 101 Switching Protocols" + newLine
                     + "Upgrade: websocket" + newLine
                     + "Connection: Upgrade" + newLine
                     + "Sec-WebSocket-Accept: " + test1 + newLine + newLine
                     + "Sec-WebSocket-Key: " + test1 + newLine + newLine
                     + "Sec-WebSocket-Key: " + test1 + newLine + newLine
                    //+ "Sec-WebSocket-Protocol: chat, superchat" + newLine
                    //+ "Sec-WebSocket-Version: 13" + newLine
                     ;

                // which one should I use? none of them fires the onopen method
                client.Send(System.Text.Encoding.UTF8.GetBytes(response));

                var i = client.Receive(buffer); // wait for client to send a message

                // once the message is received decode it in different formats
                Console.WriteLine(Convert.ToBase64String(buffer).Substring(0, i));
                /*
                Console.WriteLine("\n\nPress enter to send data to client");
                Console.Read();
                */
                var subA = SubArray<byte>(buffer, 0, i);
                Console.WriteLine("***SUBA****:"+subA);
                Console.WriteLine("TEST");
                client.Send(subA);

                // Thread.Sleep(10000);//wait for message to be send

                // OnClientConnect();
            }
        }

        public static T[] SubArray<T>(T[] data, int index, int length)
        {
            T[] result = new T[length];
            Array.Copy(data, index, result, 0, length);
            Console.WriteLine(result);
            return result;
        }

        private static string AcceptKey(ref string key)
        {
            string longKey = key + guid;
            byte[] hashBytes = ComputeHash(longKey);
            return Convert.ToBase64String(hashBytes);
        }

        static SHA1 sha1 = SHA1CryptoServiceProvider.Create();
        private static byte[] ComputeHash(string str)
        {
            return sha1.ComputeHash(System.Text.Encoding.ASCII.GetBytes(str));
        }
    }
}

客戶(HTML5):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <script type="text/javascript">
        function connect() {
            var ws = new WebSocket("ws://localhost:8080");
            console.log(ws);
            ws.onopen = function () {
                alert("About to send data");
                ws.send("test"); // I WANT TO SEND THIS MESSAGE TO THE SERVER!!!!!!!!
                alert("Message sent!");
            };

            ws.onmessage = function (evt) {
                alert("About to receive data");
                var received_msg = evt.data;
                alert("Message received = "+received_msg);
            };
            ws.onclose = function () {
                // websocket is closed.
                alert("Connection is closed...");
            };
        };

        function send(){
        }


    </script>
</head>
<body style="font-size:xx-large" >
    <div>
    <a href="#" onclick="connect()">Click here to start</a></div>

</body>
</html>

我可以得到這個:

 alert("About to send data");

和這個:

alert("Message sent!");

但是之后,連接關閉。 我還可以檢查服務器是否從客戶端接收數據。 關鍵是,一旦我從服務器向客戶端發送數據,我就能夠返回客戶端給我的內容,連接突然關閉。 可能是什么問題?

Websocket消息不是純文本。 他們需要應用簡單的框架協議

客戶端->服務器和服務器->客戶端消息的框架規則略有不同。 我想象當您嘗試不應用其他框架而回顯其消息時,客戶端正在關閉其連接。

有關如何解碼/編碼消息,請參見RFC6455的數據成幀部分 或者,如果您使用的是.NET4.5,則可以考慮使用System.Net.WebSockets,而不是編寫自己的服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM