繁体   English   中英

C#TCP Socket流消息混乱

[英]C# TCP Socket stream message confusion

我正在尝试编写C#TCP服务器并连接我的Web应用程序。 这是我正在关注的教程。 链接

我设法启动了服务器,但从Web应用程序收到的消息已加密。

C#代码段

using System;
using System.Net;
using System.Net.Sockets;
using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;

namespace Application
{
class MainClass
{
    public static void Main()
    {
        TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 8181);
        server.Start();

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

        TcpClient client = server.AcceptTcpClient();
        Console.WriteLine("A client connected.");

        NetworkStream stream = client.GetStream();
        while (true)
        {
            while (!stream.DataAvailable) ;

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

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

            String data = Encoding.UTF8.GetString(bytes);

            //handshaking
            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);
            }
        }
    }
}
}

HTML片段

<form>
<input id="textField1" type="text" style="margin: 0 5px; width: 200px; height: 40px;" placeholder="Enter data">
<button id="sendTextField1" type="button" class="btn btn-info">Send</button>
  </form>
  <script type="text/javascript">
    var start = function () {
    var wsImpl = window.WebSocket || window.MozWebSocket;
    window.ws = new wsImpl('ws://127.0.0.1:8181/');

    ws.onmessage = function (evt) {
      console.log(evt.data);
    };
    ws.onopen = function () {
      console.log("Connected");
    };
    ws.onclose = function () {
      console.log("Closed");
    };

    document.getElementById("sendTextField1").onclick = function() {
      sendToSocket(document.getElementById('textField1').value);
    };

    function sendToSocket(value){
      console.log("Sending value to socket " + value + " ");
      ws.send(value);
    };
}
window.onload = start;

这是我从控制台获得的 在此处输入图片说明

我已经尝试将邮件编码为另一种格式,但是根本没有运气。

根据这个stackoverflow用户

消息不是以原始格式发送的,但是具有数据框架。

它与我现在遇到的问题有关吗? 我是否需要找到一种方法来对我从应用程序中获得的数据进行解构?

好吧,这不是一个好的开始:

String data = Encoding.UTF8.GetString(bytes);

握手后发送的数据不是UTF8文本 它的一部分是,但是有二进制标头,并且还有一些东西(至少在RFC6455中-如果您的客户端使用Hixie-76,则可能不是),称为“客户端到服务器掩码” ,这意味着数据确实被杂乱无章了。 (这是IIRC,主要是为了避免代理服务器出现问题,并且不打算进行加密)。

还有一个循环遍历握手的问题,但是:您只握手一次。

基本上,网络套接字协议非常细微 (并且:某些浏览器/版本严重/错误地实施了该协议)。 除非您有很好的理由*,否则我强烈建议您使用一个库,而不要尝试手动编写。 Microsoft在框架中提供了一定程度的支持,应该会有所帮助。


* =我已经做到了,但是对于我们的场景,关键的设计原因是可伸缩性-我们目前有464515个开放式Web套接字连接,而MS实施并不会削减它。 如果有帮助,我们免费提供了代码。

暂无
暂无

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

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