gpt4 book ai didi

sockets - 网页只在服务器停止后显示

转载 作者:行者123 更新时间:2023-12-03 11:58:04 25 4
gpt4 key购买 nike

我正在用 Erlang 编写一个自制的 Web 服务器以用于学习目的。当前的实现可以解析 HTTP GET 请求并做出相应的响应。问题是在我关闭服务器进程之前,我的测试 HTML 文件不会显示在 Web 浏览器中。我在控制台中看到打印件发送的消息,但 Web 浏览器一直在加载,直到服务器停止。在服务器停止的同一时刻显示页面。为什么是这样?

listener(Listen) ->
case gen_tcp:accept(Listen) of
{ok, Client} ->
case gen_tcp:recv(Client, 0) of
{ok, Request} ->
workers:worker({Client, Request});
{error, closed} ->
io:format("Socket closed.~n");
{error, _Reason} ->
io:format("Error: ~w~n", [_Reason])
end,
listener(Listen);
{error, Error} ->
io:format("Error ~w~n", [Error]),
error
end.

worker({Client, Request}) ->
{Request_line, Headers, Body} = http_parse:parse_request(Request),
Response = http_parse:create_response({Request_line, Headers, Body}),
case gen_tcp:send(Client, Response) of
ok ->
io:format("Message sent!~n");
{error, Reason} ->
io:format("Could not send packet: ~w~n", [Reason])
end.

以上是我写的一些代码。我已经忽略了解析,但这部分有效。 listener/1 接收通过使用选项列表 {active, false} 调用 gen_tcp:listen/2 创建的套接字。任何关于为什么页面仅在服务器关闭后才显示的指导表示赞赏。

最佳答案

问题是响应 header 缺少 Content-Length数据。
没有 Content-Length数据,客户端假设断开连接将标记数据(正文)段的结束。
您的服务器从不关闭连接(也没有实现超时),因此客户端一直在等待更多数据(它假设更多数据正在传输中)。
一旦连接关闭,客户端将其标记为主体(数据)段的结尾。
您应该考虑实现超时以及管理 Content-Length 的响应 header , ConnectionKeep-Alive .
考虑通过阅读一些 specs 来了解有关该协议(protocol)的更多信息。或在维基百科中阅读 HTTP Protocol它是 headers .

关于sockets - 网页只在服务器停止后显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37999547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com