http - 将套接字与进程相关联

标签 http sockets tcp erlang

我有一些问题。

我想将进程与一个用户相关联(来自用户的所有请求都接收一个进程,在 HTTP 1.1 中默认保持事件状态是打开的,并且所有请求都通过一个套接字发送。)

我有以下代码:

loop(Sock, Reg_pid) ->

    {ok, Conn} = gen_tcp:accept(Sock),

    Pid = spawn(fun () -> client_socket(Conn,Reg_pid) end),
    gen_tcp:controlling_process(Conn, Pid),

    Pid ! {take, Conn}, %% race condition 

loop(Sock, Reg_pid).

client_socket(S,Reg_pid) ->

    io:format("in~n"),

receive

    {take, So} ->
        inet:setopts(So, [{active, once}]),
        client_socket(So, Reg_pid);

    {http, Socket, {http_request, _Method, {abs_path, _Path}, _Vers}} ->

        case http_uri2:parse_path_query(_Path) of

            {"/",[]} -> 

                io:format("Main pid - ~p ~n", [self()]),                
                gen_tcp:send(Socket, response("<a href='http://127.0.0.1:8080/register?name=Max'>Click</a>"));              

            {"/register",[{"name", Player_name}]} ->

                io:format("Register pid - ~p ~n", [self()]);



            _-> ok

        end,

        inet:setopts(Socket, [{active, once}]),

        client_socket(Socket, Reg_pid);

     {tcp_closed, Socket} ->

        io:format("Socket ~w closed [~w]~n",[Socket,self()]);
    %   gen_tcp:close(Socket);

      {tcp_error, Socket, Reason} ->
            io:format("Error ~w closed [~w]~n",[Socket,self()]);


    _-> ok


end.

当我通过浏览器连接到服务器(索引页面)然后单击返回服务器的链接时,我得到下一个结果:

3> server:start(8080).
<0.43.0>
in 
Main pid - <0.45.0> 
in 
in 
Register pid - <0.46.0> 
in 

我不明白为什么我的下一个请求(点击链接)收到其他进程(注册 pid - <0.46.0>)?

这样,来自一个用户的所有请求都会产生新进程,我希望来自一个用户的所有请求都处理一个进程,我该如何实现?

谢谢!

最佳答案

浏览器可能会选择不遵守 Keep-Alive,而是创建一个新套接字。您可以考虑向浏览器发送一个 session cookie,将当前 session 与某个进程相关联,而不是信任 Keep-Alive。 session cookie 将由浏览器针对每个请求发送。在为新请求创建新进程之前,检查 session cookie 并查看是否已经有与该 session 关联的进程。

关于http - 将套接字与进程相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10869405/

相关文章:

tcp - 从标准输入读取时,如何按端口过滤 Wireshark?

java - html 的 HTTP gzip 编码

http - 有没有办法将传入的电子邮件转换为 HTTP POST 请求?

java - 在 linux 平台上使用套接字时是否存在文件描述符泄漏?

Linux Socket编程 : what happen in server socket when client socket gone off in the middle of communication

c# - 从选定进程读取传出数据包

c# - 如何在 C# 中获取异步 TCP 对象流?

javascript - 强制 Chromium 每页使用不同的 cookie jar

http - 使用 Comet/持久 HTTP 连接时,客户端和后端有哪些缺点?

java - 如何在 Android API 25 中进行套接字/线程