繁体   English   中英

C#WebSocket服务器从JavaScript接收文本

[英]C# websocket server receive text from javascript

我目前正在测试一些基本的websocket示例,但这些示例并不能完全帮助我。 我了解如何使用C#在服务器上创建侦听器,以及如何将请求升级为Web套接字。 我需要帮助来检索从javascript发送到服务器的字符串。

C#代码:

class Program
{
    private static void ThreadProc(object obj)
    {
        var client = (TcpClient)obj;

        var address = client.Client.RemoteEndPoint.ToString().Split(':');

        Console.WriteLine(String.Format("A client is connected from {0}", address[0]));

        NetworkStream stream = client.GetStream();

        //enter to an infinite cycle to be able to handle every change in stream
        while (true)
        {
            while (!stream.DataAvailable) ;

            Byte[] bytes = new Byte[client.Available];

            stream.Read(bytes, 0, bytes.Length);

            //translate bytes of request to string
            String data = Encoding.UTF8.GetString(bytes);

            if (new Regex("^GET").IsMatch(data))
            {
                Byte[] response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + Environment.NewLine
                    + "Connection: Upgrade" + Environment.NewLine
                    + "Upgrade: websocket" + Environment.NewLine
                    + "Sec-WebSocket-Accept: " + Convert.ToBase64String(
                        SHA1.Create().ComputeHash(
                            Encoding.UTF8.GetBytes(
                                new Regex("Sec-WebSocket-Key: (.*)").Match(data).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
                            )
                        )
                    ) + Environment.NewLine
                    + Environment.NewLine);

                stream.Write(response, 0, response.Length);
            }
            else
            {
                Console.WriteLine(data);
            }
        }
    }

    static void Main(string[] args)
    {
        TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 80);

        server.Start();
        Console.WriteLine("Server has started on 127.0.0.1:80.{0}Waiting for a connection...", Environment.NewLine);

        while (true)
        {
            var clientConnection = server.AcceptTcpClient();
            ThreadPool.QueueUserWorkItem(ThreadProc, clientConnection);
        }

    }
}

用于连接到websocket的Javascript。

var host = window.location.origin.replace("http", "ws");
    var socket = new WebSocket("ws://127.0.0.1:80");

    socket.onopen = function (openEvent) {
        console.log("Socket connection is open.");
        sendTextMessage();
    };

    function sendTextMessage() {
        if (socket.readyState != WebSocket.OPEN)
        {
            console.log("Socket is not open for connection.");
            return;
        }
        socket.send("MDN");
    }

更新我现在可以看到消息了。 但是,我没有得到字符串MDN,而是得到了一些时髦的字符。 更新了我的C#代码以显示更改。

我只是在尝试将javascript中的字符串发送到服务器,然后在控制台上读取该字符串。 如果任何人都可以说明更多如何同时连接多个Web浏览器,那将是很棒的。 另外,如果有人可以指出我要向所有连接的Web浏览器发送消息,请这样做。

如果这是重复的操作,请指出正确的方向。

问题 :“多个网络浏览器同时连接”

while(serverIsOn){
    TcpClient cliTemp = server.AcceptTcpClient();
    NetworkStream netTemp = cliTemp.GetStream(); 
    Client cli = new Client(Necessary attributes);
    clientsList.Add(cli);
}

每次获得一个连接时,将每个属性放入一个新对象(创建类Client)中,并带有从该客户端示例进行响应/接收所需的属性(TcpClient,NetworkStream,clientName ...)

[另一个线程]在客户端列表和调用Read之前的新循环:

循环(clientsList)

 if(cli.networkStream.DataAvailable){ cli.networkStream.Read(buffer, 0, buffer.Lenght); } 

问题 “更新,我现在可以看到消息。但是,我没有得到字符串MDN,但得到了一些时髦的字符。更新了C#代码以显示更改。” 我想您正在遵循本教程https://developer.mozilla.org/zh-CN/docs/Web/API/WebSockets_API/Writing_WebSocket_server

它说来自JavaScript的消息响应包含某些位,这些位指示消息是否为最终消息,消息有多长时间,以及用于解码消息的关键代码,这是一个小解决方案:

public byte[] javaScriptUser(Byte[] data)
    {
        //encoded[1] => size of msg
        Byte[] encoded = new Byte[((int)data[1] - 128)];
        Array.Copy(data, 6, encoded, 0, encoded.Length);
        Byte[] decoded = new Byte[((int)data[1] - 128)]; 

        //KeyCode positions
        Byte[] key = new Byte[4] { data[2], data[3], data[4], data[5] };

        for (int i = 0; i < encoded.Length; i++)
        {
            decoded[i] = (Byte)(encoded[i] ^ key[i % 4]);
        }
        Array.Copy(decoded, data, decoded.Length);
        return decoded;
    }

不包括这部分! (“如果是126,则后面的2个字节(16位无符号整数),如果是127,则后面的8个字节(64位无符号整数)是长度。”)最后一部分有点混乱几分钟,但是我相信你可以做得更好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM