Elixir 长生不老药

Elixir 长生不老药,elixir,Elixir,如何在Elixir中复用套接字?我需要连接到核心银行,但它只接受一个tcp连接,我的应用程序收到了许多并发连接。有什么建议吗?我会将整个套接字处理打包到GenServer中,然后它将充当网关,一次只处理一条消息。例如: defmodule Client do use GenServer @name __MODULE__ # API def start_link do GenServer.start_link(__MODULE__, :ok, [name: @name]

如何在Elixir中复用套接字?我需要连接到核心银行,但它只接受一个tcp连接,我的应用程序收到了许多并发连接。有什么建议吗?

我会将整个套接字处理打包到GenServer中,然后它将充当网关,一次只处理一条消息。例如:

defmodule Client do
  use GenServer
  @name __MODULE__

  # API

  def start_link do
    GenServer.start_link(__MODULE__, :ok, [name: @name])
  end

  def command(data) do
    GenServer.call(@name, {:command, data})
  end

  # GenServer implementation

  def init(:ok) do
    :gen_tcp.connect('localhost', 9999, [active: false, packet: :line])
  end

  def handle_call({:command, data}, _from, socket) do
    :gen_tcp.send(socket, data <> "\n")
    {:ok, result} = :gen_tcp.recv(socket, 0)
    {:reply, result, socket}
  end
end

我将把整个套接字处理封装在一个GenServer中,然后它将充当网关,一次只处理一条消息。例如:

defmodule Client do
  use GenServer
  @name __MODULE__

  # API

  def start_link do
    GenServer.start_link(__MODULE__, :ok, [name: @name])
  end

  def command(data) do
    GenServer.call(@name, {:command, data})
  end

  # GenServer implementation

  def init(:ok) do
    :gen_tcp.connect('localhost', 9999, [active: false, packet: :line])
  end

  def handle_call({:command, data}, _from, socket) do
    :gen_tcp.send(socket, data <> "\n")
    {:ok, result} = :gen_tcp.recv(socket, 0)
    {:reply, result, socket}
  end
end

每个套接字启动一个进程。每个套接字启动一个进程。“每个套接字启动一个进程。”但你说得比我好多了:-p这是一个很好的答案,但按照你的示例,如果发送10个请求,同样需要一个接一个地发送,并且接收服务器响应的顺序不一定相同,ie可以收到三个粘合的答案,我必须分段读取前两个字节的消息,这表示响应OK的长度I,以便您能够从套接字并行读/写?一般来说,这应该是没有问题的,因为TCP在设计上允许这样做。请求与响应如何匹配?如果响应不符合顺序,您需要一种方法来匹配它们。如果没有这些细节,很难给出一个很好的答案。请求是一个金融交易,使用标准ISO885,请求和响应有一个ID(6个位置的数值),I NEDD匹配响应,非常重要的是考虑响应消息的长度是可变的,读取每个响应的前两个字节很重要。谢谢你的帮助对不起,答案是肯定的,我需要从/到套接字同时读/写“每个套接字启动一个进程”。但是你说得比我好多了:-p这是一个很好的答案,但是按照你的例子,如果发送10个请求,同样需要一个接一个地发送,接收服务器响应的顺序不一定相同,即可以接收三个粘合的答案,我必须分段读取前2个字节的消息,这表示响应k的长度I,以便您能够同时从/向套接字读/写?一般来说,这应该是没有问题的,因为TCP在设计上允许这样做。请求与响应如何匹配?如果响应不符合顺序,您需要一种方法来匹配它们。如果没有这些细节,很难给出一个很好的答案。请求是一个金融交易,使用标准ISO885,请求和响应有一个ID(6个位置的数值),I NEDD匹配响应,非常重要的是考虑响应消息的长度是可变的,读取每个响应的前两个字节很重要。谢谢你的帮助对不起,答案是肯定的,我需要从/到套接字同时读/写
socat -v tcp-l:9999,reuseaddr,fork exec:cat