【问题标题】:How can I listen multiple ports via Elixir?如何通过 Elixir 监听多个端口?
【发布时间】:2018-08-06 21:54:47
【问题描述】:

我想通过 Elixir 监听 2 个端口。不过,我设法监听了端口。但是,我无法从第二个端口获取数据。

  def accept() do
    {:ok, socket} = :gen_tcp.listen(7777, [:binary, packet: 0, active: false, reuseaddr: true])

    {:ok, httpSocket} =
      :gen_tcp.listen(8787, [:binary, packet: 0, active: false, reuseaddr: true])

    http_loop_acceptor(httpSocket)
    loop_acceptor(socket)
  end

  defp http_loop_acceptor(socket) do
    {:ok, client} = :gen_tcp.accept(socket)
    pid = spawn(fn -> http_serve(client) end)
    :ok = :gen_tcp.controlling_process(client, pid)
    http_loop_acceptor(socket)
  end

  defp loop_acceptor(socket) do
    {:ok, client} = :gen_tcp.accept(socket)
    pid = spawn(fn -> serve(client) end)
    :ok = :gen_tcp.controlling_process(client, pid)
    loop_acceptor(socket)
  end

我可以将数据发送到8787端口(httpSocket)。但是,我无法向 7777(套接字)发送任何数据。

如果改变这两行的顺序,我可以发送数据到7777(socket),我不能发送任何数据到8787端口。 p>

http_loop_acceptor(httpSocket)
loop_acceptor(socket)

如何监听多个端口并通过这些端口接收数据?

【问题讨论】:

    标签: networking network-programming erlang elixir gen-tcp


    【解决方案1】:

    在您的accept 函数中,对http_loop_acceptor 的调用将无限递归,这意味着永远不会调用loop_acceptor

    如果你想监听两个套接字,你需要启动两个独立的进程,每个进程一个。一种快速而肮脏的方法是使用spawn,但在实际应用程序中,您会将这些流程建模为监督树的一部分。

    【讨论】:

    • 这是第一次接触 Erlang/Elixir 时最难理解的事情之一。我花了很长时间才这么想。
    猜你喜欢
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多