3

我使用 gen_tcp OTP 模块在 Elixir 中编写了以下 TCP 服务器:

defmodule Test do
  def server() do
    {:ok, listen_sock} = :gen_tcp.listen(43594, [{:active, true}, :binary])
    {:ok, accept_sock} = :gen_tcp.accept(listen_sock)
    spawn(fn() -> poll(accept_sock) end)
  end

  defp poll(sock) do
    case :gen_tcp.recv(sock, 0, 20) do
      {:ok, data} ->
          IO.puts "#{data}"
          poll(sock)
      {:error, :closed} -> :ok
    end
  end
end

Test.server

一旦我使用 telnet 连接到服务器,它就会断开连接。知道发生了什么吗?

4

1 回答 1

4

我认为这是因为 server() 在 spawn() 被调用并且您的应用程序正常退出之后返回。我会这样写:

defmodule Test do
  def server() do
    {:ok, listen_sock} = :gen_tcp.listen(43594, [{:active, true}, :binary])
    {:ok, accept_sock} = :gen_tcp.accept(listen_sock)
    poll(accept_sock)
  end

  defp poll(sock) do
    case :gen_tcp.recv(sock, 0, 20) do
      {:ok, data} ->
          IO.puts "#{data}"
          poll(sock)
      {:error, :closed} -> :ok
    end
  end
end

Test.server

我没有测试上面的代码,但这应该可以解决你的问题。

于 2014-04-20T00:02:51.707 回答