【发布时间】: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