使用C#创建一个简单的WebSocket服务器 [英] Create a Simple WebSocket server using C#

查看:99
本文介绍了使用C#创建一个简单的WebSocket服务器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用C#创建一个Websocket服务器。这成功地将我的Websocket服务器与Web应用程序连接,但无法向Web客户端和Web服务器发送任何消息。







我在这里附上我的代码



 TcpListener server =  new  TcpListener(IPAddress.Parse(  127.0.0.1), 8281 ); 

server.Start();
txtOutput.Text + = 服务器已在127.0.0.1:8281启动。{0}等待连接...... + Environment.NewLine;

TcpClient client = server.AcceptTcpClient();

txtOutput.Text + = 客户端连接。;

NetworkStream stream = client.GetStream();

// 进入无限循环,以便能够处理流中的每个变化
while true
{
while (!stream.DataAvailable);

字节 [] bytes = new 字节 [client.Available];

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

// 将请求的字节翻译成字符串
String request = Encoding.UTF8.GetString(bytes);

if new 正则表达式( ^ GET)。IsMatch(request))
{
Byte [] response = Encoding.UTF8.GetBytes( HTTP / 1.1 101交换协议 + Environment.NewLine
+ 连接:升级 + Environment.NewLine
+ 升级:websocket + Environment.NewLine
+ Sec-WebSocket-Accept: + Convert.ToBase64String(
SHA1.Create()。ComputeHash(
) Encoding.UTF8.GetBytes(
new 正则表达式( Sec-WebSocket-键:(。*))。匹配(请求).Groups [ 1 ]。Value.Trim()+ 258EAFA5-E914-47DA-95CA-C5AB0DC85B11


)+环境。 NewLine
+ Environment.NewLine);

stream.Write(response, 0 ,response.Length);
}
其他
{
// < span class =code-comment>这部分中的一些错误

txtOutput.Text + = request;
字节 [] response = Encoding.UTF8.GetBytes( 收到的数据);
stream.Write(response, 0 ,response.Length);

}
}







我用这个样本开发了本文链接 https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_server #Decoding_messages [ ^ ]

解决方案

根据http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17

你必须添加标题字节。

  //  一些bug在这部分 
txtOutput.Text + = request;
字节 [] response = Encoding.UTF8.GetBytes( +收到的数据 );
response [0] = 0x81; //表示这是最后的消息,它在文本
response [1] = response.Length - 2; // payload size = message - header size
stream.Write(response,0,response 。长度);


I am creating a Websocket server using C#. This successfully connected my Websocket server with the web application but not able to send any message to the web client and to the web server.



I am attaching my code here

TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 8281);

            server.Start();
            txtOutput.Text += "Server has started on 127.0.0.1:8281.{0}Waiting for a connection..." + Environment.NewLine;

            TcpClient client = server.AcceptTcpClient();

            txtOutput.Text += "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);

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

                if (new Regex("^GET").IsMatch(request))
                {
                    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(request).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
                                )
                            )
                        ) + Environment.NewLine
                        + Environment.NewLine);

                    stream.Write(response, 0, response.Length);
                }
                else
                {
                     //some bug in this part
                    txtOutput.Text += request;
                    Byte[] response = Encoding.UTF8.GetBytes("Data received");
                    stream.Write(response, 0, response.Length);
                  
                }
            }




I developed this Sample using this article link https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_server#Decoding_messages[^]

解决方案

According to http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17
you must add header bytes.

//some bug in this part
txtOutput.Text += request;
Byte[] response = Encoding.UTF8.GetBytes("  " + Data received");
response[0] = 0x81; // denotes this is the final message and it is in text
response[1] = response.Length - 2; // payload size = message - header size
stream.Write(response, 0, response.Length);


这篇关于使用C#创建一个简单的WebSocket服务器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆