【问题标题】:Server response to put with c# socket使用 c# 套接字放置的服务器响应
【发布时间】:2021-12-24 08:29:20
【问题描述】:

我有以下服务器代码:

class Program
{

    
    static void Main(string[] args)
    {
        Socket server = new Socket(AddressFamily.InterNetwork, 
        SocketType.Stream, ProtocolType.Tcp);
        server.Bind(new IPEndPoint(IPAddress.Any, 8000));

        server.Listen();


        while (true)
        {
            Socket client = server.Accept();
            StreamReader streamReader = new StreamReader(new 
            NetworkStream(client));
            StringBuilder buffer = new StringBuilder();
            string eof = new string(new char[] { (char)10, (char)13, 
            (char)10 });

            while (!buffer.ToString().Contains(eof))
            buffer = buffer.Append((char)streamReader.Read());

            Console.WriteLine(buffer);
            StreamWriter streamWriter = new StreamWriter(new 
            NetworkStream(client));

            streamWriter.WriteLine();
            streamWriter.Flush();


        }

    }

    static string createResponse()
    {
        string s = @"
        HTTP/1.1 200 OK
        Date: " + DateTime.Now + @"
        Server: Custom
        Connection: keep-alive
        Allow: OPTIONS, GET, PUT
        Access-Control-Allow-Origin: *
        Access-Control-Allow-Methods GET, POST, PUT, DELETE, HEAD, OPTIONS
        Access-Control-Allow-Headers: *
        Access-Control-Allow-Credentials: true";

        return s;
    }
}

并遵循客户端代码(javascript):

function connect() {
    fetch('http://127.0.0.1:8000', 
    {
        method: 'put',
        headers: {
            "Content-Type" : "text/html"
        },
        body: "Test"
    });

}

我在服务器中得到以下输出:

OPTIONS / HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Accept: */*
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: content-type
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Sec-Fetch-Mode: cors
Sec-Fetch-Site: cross-site
Sec-Fetch-Dest: empty
Accept-Encoding: gzip, deflate, br
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7

但是我在任何地方都找不到正文,甚至在收到的客户端标头中找不到内容类型/长度 - 为什么?我到底做错了什么?在发送服务器标头后,我尝试将流位置设置为零(尽管这根本没有意义,因为它是网络流),但正如预期的那样,它引发了错误。关于 PUT 方法,HTTP 协议究竟是如何工作的?为了在服务器和客户端之间建立正确的交换,服务器需要提供什么?

【问题讨论】:

    标签: c# http sockets webserver webclient


    【解决方案1】:

    感谢上帝,这里有解决方案:

    class Program
        {
    
            static void Main(string[] args)
            {
                Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                server.Bind(new IPEndPoint(IPAddress.Any, 8000));
    
                server.Listen(int.MaxValue);
    
    
                while (true)
                {
                    Socket client = server.Accept();
                    StreamReader streamReader = new StreamReader(new NetworkStream(client));
                    StringBuilder buffer = new StringBuilder();
                    string eof = new string(new char[] { (char)10, (char)13, (char)10 });
    
                    while (!buffer.ToString().Contains(eof))
                        buffer = buffer.Append((char)streamReader.Read());
    
    
    
                    StreamWriter streamWriter = new StreamWriter(new NetworkStream(client));
                    streamWriter.WriteLine(createCORSHeader());
                    streamWriter.Flush();
    
    
                    int contentLength = 0;
    
                    var lines = buffer.ToString().Split('\n');
                    for (int i = 0; i < lines.Length; i++)
                    {
                        var keyValuePair = lines[i].Split(':');
                        if (keyValuePair.Length < 2)
                            continue;
    
                        var key = keyValuePair[0];
                        var val = keyValuePair[0 + 1].Substring(1, keyValuePair[1].Length - 1);
    
                        if (key.Equals("Content-Length"))
                            contentLength = int.Parse(val);
                    }
    
    
                    buffer.Clear();
    
                    for (int i = 0; i < contentLength; i++)
                        buffer.Append((char)streamReader.Read());
    
    
    
                    File.AppendAllText("protokoll.txt", "[" + DateTime.Now + "]\t" + buffer.ToString() + Environment.NewLine);
    
    
                    streamWriter.WriteLine(createPUTResponse());
                    streamWriter.Flush();
    
    
                    client.Close();
    
                    Console.WriteLine("Done.");
                }
    
            }
    
            static string createCORSHeader()
            {
                string s = @"
    HTTP/1.1 204 No Content
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT
    Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
    Access-Control-Max-Age: 86400
    Vary: Accept-Encoding, Origin
    Keep-Alive: timeout=2, max=100
    Connection: Keep-Alive
    ";
    
                return s;
            }
    
    
            static string createPUTResponse()
            {
                string s = @"
    HTTP/1.1 204 No Content
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT
    Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
    Access-Control-Max-Age: 86400
    Vary: Accept-Encoding, Origin
    Keep-Alive: timeout=2, max=100
    Connection: Keep-Alive
    ";
    
                return s;
            }
        }
    

    【讨论】:

    • 你为什么要这样做?这远非一个兼容的 HTTP 服务器。为什么不使用 HttpListener、ASP.NET Core MVC 或众多替代方案之一?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-13
    相关资源
    最近更新 更多