我使用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连接到服务器,它就会断开连接。 知道发生了什么事吗?

===============>>#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

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

  ask by leaf translate from so

未解决问题?本站智能推荐:

1回复

使用gen_tcp时套接字的接受率

使用gen_tcp行为时,我发现了一个有趣的问题。 我有一个服务器和一个客户端。 服务器接受连接,客户端创建许多进程,所有进程都尝试连接到侦听服务器。 如果我尝试启动客户端,它会产生许多进程,所有进程都试图同时连接到套接字,那么很多进程都会失败。 但是,如果我放置timer:slee
1回复

使用gen_tcp:send / 2通过套接字发送消息

如何使用gen_tcp以erlang格式发送[Integer,String]形式的消息。 例如:我正在寻找使用gen_tcp:send / 2通过套接字发送[25,“ Hello”]或[50,“ Hi”]形式的消息。 我尝试做[ID | 讯息],但这无济于事。 谢谢
1回复

在打开的连接中将消息从Elixir中的TCP服务器发送到TCP客户端

我通过使用Erlang :gen_tcp模块的实现在Phoenixframwork中开发了一个TCP服务器。 我可以通过调用:gen_tcp.listen(port)来启动服务器,然后监听该端口上的新连接。 一个客户是药房的自动拣选系统(基本上是自动配药机器人)。 因此,作为T
2回复

在Elixir中设置gen_tcp的参数

我正在尝试使用Erlang gen_tcp通过Elixir中的TCP连接接受数据 但这由于connect错误论点而无法正常工作。 如何在Elixir中设置二进制和数据包值? 在此对参数含义进行说明。 但是我需要支持在Elixir中设置参数。
3回复

Erlang SSL TCP服务器和垃圾回收

编辑:问题似乎与SSL匹配和内存泄漏有关。 我已经注意到,如果您的Processes(它是服务器)的寿命很长,并且客户端将数据发送到服务器(recv),则Erlang垃圾回收永远不会被调用(或很少调用) 服务器需要数据(以执行操作),并且数据可以是可变长度的(由于诸如“ Hello”
1回复

Erlang gen_tcp:listen / 2 for IPv6

我有.NET TCP Sender发送到Erlang接收器。 .NET组件在解析localhost时喜欢使用IPv6地址::1 。 我不太确定如何使用gen_tcp使Erlang监听IPv6地址。 这是我的尝试。 我是在告诉错误的套接字进行监听吗? 谢谢!
2回复

Erlang OTP管理员gen_tcp-{error,eaddrinuse}

我看不到如何在崩溃的gen_tcp:listen-thread中添加管理程序实际上会重新启动该工作程序。 由于崩溃将使端口失效,因此我想在短时间内听不到任何使用。 当发生崩溃并尝试手动重新启动应用程序时,我收到“ {error,eaddrinuse}”。 由于尚未看到工作原理,因此我尚未为
1回复

gen_tcp通过gen_server套接字立即监听关闭

我想在gen_server上使用gen_tcp,这是代码: 嗯, tcp_listener立即在waitConnetion之前waitConnetion ,我真的不明白为什么。 如果我在init部分上移动handle_cast代码,它将正常工作。 为什么关闭连接? 我花很多
1回复

Erlang TCP服务器/客户端发送消息

我当前正在编写一个简单的服务器,该服务器将与客户端连接,然后在服务器充当中介的情况下互相交谈。 设置为: 服务器启动 2个客户端连接到服务器 Client1 / 2发送具有其唯一ID(原子)的消息 服务器将此ID与套接字PID一起保存 客户端1发送
1回复

如何使用gen_tcp在Elixir中的活动套接字上检测TCP超时?

我有一个GenServer通过gen_tcp连接到远程TCP连接。 opts = [:binary, active: true, packet: :line] {:ok, socket} = :gen_tcp.connect('remote-url', 8000, opts} 我正在