【问题标题】:javascript and C# server communicationjavascript 和 C# 服务器通信
【发布时间】:2012-02-08 05:30:02
【问题描述】:

我在 C#(client-server) 中开发了一个应用程序,使用套接字在客户端和服务器之间进行通信。现在我想使用 javascript(基于development guide about javascript)为 android 创建相同的应用程序,但要保持用 C# 制作服务器(我可以通过通信更改部分但不多)。下面是代码的样子:

服务器端:

connection.Send(Encoding.ASCII.GetBytes("HTTP/1.1 101 Switching Protocols\r\nUpgrade:  WebSocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: " + aux));
connection.Send(Encoding.ASCII.GetBytes("\r\n\r\n"));

辅助在哪里:

public static String ComputeWebSocketHandshakeSecurityHash09(String secWebSocketKey)
    {
        const String MagicKEY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
        String secWebSocketAccept = String.Empty;

        // 1. Combine the request Sec-WebSocket-Key with magic key.
        String ret = secWebSocketKey + MagicKEY;

        Console.WriteLine("-   " + ret + "   -");

        // 2. Compute the SHA1 hash
        SHA1 sha = new SHA1CryptoServiceProvider();
        byte[] sha1Hash = sha.ComputeHash(Encoding.UTF8.GetBytes(ret));

        // 3. Base64 encode the hash
        secWebSocketAccept = Convert.ToBase64String(sha1Hash);

        return secWebSocketAccept;
    }

我在 javascript 中创建了一个带有 websockets 的客户端,该客户端连接到一个 c sharp 服务器。问题是握手后我的连接关闭了,我不知道为什么。我得到的唯一错误是:“无法识别的帧操作码:7”。我使用谷歌浏览器 16.0.912.75。

一步一步:

  1. WebSocket 可用
  2. 服务器收到握手请求
  3. Sec-WebSocket-Accept 生成并发送到浏览器
  4. 浏览器识别密钥并执行 .onopen 方法
  5. 在这之后我得到错误

    var ws;
    $(document).ready(function () {
    
    // test if the browser supports web sockets
    if ("WebSocket" in window) {
        debug("Browser supports web sockets!", 'success');
        connect($('#host').val());
        $('#console_send').removeAttr('disabled');
    } else {
        debug("Browser does not support web sockets", 'error');
    };
    
    // function to send data on the web socket
    function ws_send(str) {
        try {
            ws.send(str);
        } catch (err) {
            debug(err, 'error');
        }
    }
    
    // connect to the specified host
    function connect(host) {
    
        debug("Connecting to " + host + " ...");
        try {
            ws = new WebSocket(host); // create the web socket
        } catch (err) {
            debug(err, 'error');
        }
        $('#host_connect').attr('disabled', true); // disable the 'reconnect' button
    
        ws.onopen = function () {
            debug("connected... ", 'success'); // we are in! Big Grin | :-D 
        };
    
        ws.onmessage = function (evt) {
            debug(evt.data, 'response'); // we got some data - show it omg!!
        };
    
        ws.onclose = function () {
            debug("Socket closed!", 'error'); // the socket was closed (this could be an error or simply that there is no server)
            $('#host_connect').attr('disabled', false); // re-enable the 'reconnect button
        };
    };
    
    // function to display stuff, the second parameter is the class of the <p> (used for styling)
    function debug(msg, type) {
        $("#console").append('<p class="' + (type || '') + '">' + msg + '</p>');
    };
    
    // the user clicked to 'reconnect' button
    $('#host_connect').click(function () {
        debug("\n");
        connect($('#host').val());
    });
    
    // the user clicked the send button
    $('#console_send').click(function () {
        ws_send($('#console_input').val());
    });
    
    $('#console_input').keyup(function (e) {
        if(e.keyCode == 13) // enter is pressed
            ws_send($('#console_input').val());
    });
    
    });
    

如果您需要更多信息,请回复。我现在在这个操作码上搜索 4h 之类的谷歌:7 问题。

【问题讨论】:

  • 我建议您查看github.com/SignalR/SignalR。它使使用 javascript 的实时应用程序更易于管理。
  • 我认为客户端(浏览器)出现“无法识别的帧”错误?如果是这样,您的服务器是否有可能在您发布上述代码的成功握手后发送数据?运行wireshark可以让你查看握手后是否有任何通信。

标签: c# javascript sockets websocket


【解决方案1】:

您还应该看看SuperWebSocket,它是一个开源的.NET WebSocket 服务器。查看那里的代码应该可以帮助您解决问题。

【讨论】:

    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 2016-10-26
    • 2011-09-23
    • 1970-01-01
    • 2019-04-15
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多