首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字在药剂中的复用

套接字在药剂中的复用
EN

Stack Overflow用户
提问于 2016-03-29 22:46:05
回答 1查看 495关注 0票数 0

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-30 09:54:37

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

代码语言:javascript
复制
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连接。

代码语言:javascript
复制
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创建一个简单的回显服务器在本地测试这一点。

代码语言:javascript
复制
socat -v tcp-l:9999,reuseaddr,fork exec:cat
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36296453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档