如何在药剂中多路复用套接字?我需要连接到核心银行,但它只接受一个tcp连接,我的应用程序收到了许多并发连接。有什么建议吗?
发布于 2016-03-30 09:54:37
我将整个套接字处理包装在一个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然后,您可以向API客户端发送许多命令,但它一次只能处理一条消息。例如,如果您同时发送10条消息,则这些消息将一个接一个地通过套接字发送,所有这些消息都使用一个TCP连接。
Client.start_link
tasks = for x <- 1..10 do
Task.async fn ->
IO.puts Client.command("Hello world #{x}!")
end
end
for task <- tasks do
Task.await(task)
end您可以通过使用socat创建一个简单的回显服务器在本地测试这一点。
socat -v tcp-l:9999,reuseaddr,fork exec:cathttps://stackoverflow.com/questions/36296453
复制相似问题