将字节数组转换为可读字符串

时间:2016-02-13 15:11:51

标签: c# encoding websocket decoding

我最近一直在尝试使用websockets作为为网站制作简单登录系统的方法,但我遇到了一个大问题。每当我从websocket发送一条消息时,它就会显示为一组随机的数字和字母(大多数情况下会显示为?? s ?? f或类似的东西)。

static TcpListener server = new TcpListener(IPAddress.Any, 8080);
public static void Main()
{

    server.Start();
   serverstart();
}

public static void serverstart()
{
    TcpClient client = server.AcceptTcpClient();

    Console.WriteLine("A client connected.");

    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);

        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);
            Console.WriteLine(data);
            stream.Write(response, 0, response.Length);
        }
        else
        {


            Console.WriteLine(data);
            }            


        }
    }
}

1 个答案:

答案 0 :(得分:1)

WebSockets使用二进制帧来传输数据。为了读取数据,你必须首先解析帧头,以确定传输了多少数据,是否有掩码,等等。你已经对它进行了排序,然后你知道流中哪些字节是你要解码的那些字节。有一个很好的参考here

基本上它比你想象的要复杂得多。不要编写自己的WebSocketServer,而是考虑使用一些已建立的项目: