c# - 通过套接字作为HTTP服务器正确接收请求数据

标签 c# sockets http tcp

我正在尝试创建一个简单的 HTTP 服务器作为学习体验。服务器应该接收请求数据并发回响应数据。首先,我创建了一个 Socket。不幸的是,我不知道如何正确实现接收部分。

我相信我不能调用 socket.Receive 并总是期望所有数据都能成功传输。我将不得不使用循环来继续流式传输数据。我不明白程序应该在什么情况下停止流式传输数据!

检查读取的字节数是否为 0 是行不通的,因为这只会在连接关闭时发生。我该如何实现?

        var listen = new TcpListener(IPAddress.Parse("127.0.0.1"), 8070);
        listen.Start();
        var con = listen.AcceptSocket();
        listen.Stop();

        using (var ms = new MemoryStream())
        {
            while (???) //what condition should stop the streaming?
            {
                var buffer = new byte[8000];
                int read = con.Receive(buffer);

                ms.Write(buffer, 0, read);
            }
        }

最佳答案

嗯,经过一些失败和推理,我发现了如何正确地做到这一点!在 HTTP 规范中,它告诉我们请求将在 , 或“\r\n”之后终止。所以,这是我最终正确接收数据的代码:

        var listen = new TcpListener(IPAddress.Parse("127.0.0.1"), 8070);
        listen.Start();
        var con = listen.AcceptSocket();
        listen.Stop();

        string input = "";
        while (!input.EndsWith("\r\n\r\n"))
        {
            var buffer = new byte[8000];
            int read = con.Receive(buffer);
            input += Encoding.ASCII.GetString(buffer, 0, read);
        }

关于c# - 通过套接字作为HTTP服务器正确接收请求数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22008084/

相关文章:

c# - MemoryCache OutOfMemoryException

c# - 零填充 TimeSpan.ToString(String)

c - 检测客户端断开连接

java - 为什么我从 Jakarta Commons HttpClient 收到空请求?

c++ - Esp32紧急每隔一个HTTP发布请求

c# - Unity PHP Post 不发送 POST 变量

c# - 处理切换用户的系统事件

ios - 如何使用从套接字连接加载的数据初始化视频对象-iOS

c - 套接字编程中没有主机错误的路由

javascript - Angular 的 $http 中返回的 Promise 与普通 Javascript (ES6) 中返回的 Promise 相同吗?