【问题标题】:How to start iex with the environment variable for the PORT of the ListenSocket如何使用 ListenSocket 的 PORT 的环境变量启动 iex
【发布时间】:2021-01-02 06:15:27
【问题描述】:

我已经为我的应用程序创建了一个服务器和一个客户端部分,我想用不同的端口启动每个节点,我想用环境变量来做这怎么可能? 这是服务器代码:

 defmodule Multichat.Server do
  require Logger


  def accept(port) do
    {:ok, socket} = :gen_tcp.listen(port, [:binary, packet: :line, active: true, reuseaddr: true])
    Logger.info "Accepting connections on port #{port}"
    loop_acceptor(socket)
  end

  defp loop_acceptor(socket) do
    {:ok, client} = :gen_tcp.accept(socket)
    {:ok, pid} = DynamicSupervisor.start_child(Multichat.Server.ConnectionSupervisor, {Multichat.ClientConnection, client})
    :ok = :gen_tcp.controlling_process(client, pid)
    loop_acceptor(socket)
  end
end

和客户端连接代码:

defmodule Multichat.ClientConnection do
  use GenServer

  def start_link(socket), do: GenServer.start_link(__MODULE__, socket)
  def init(init_arg) do
    {:ok, init_arg}
  end

  def handle_call({:send, message}, _from, socket) do
    :gen_tcp.send(socket, message)
    {:reply, :ok, socket}
  end

  def handle_info({:tcp, _socket, message}, socket) do
    for {_, pid, _, _} <- DynamicSupervisor.which_children(Multichat.Server.ConnectionSupervisor) do
      if pid != self() do
        GenServer.call(pid, {:send, message})
      end
    end

    {:noreply, socket}
  end
end

完整代码是here

【问题讨论】:

    标签: erlang elixir gen-tcp


    【解决方案1】:

    您正在寻找System.get_env/2

    例如,您可以将 Multichat.Server.accept/1 函数修改为类似于:

    def accept(port \\ nil)
    
    def accept(nil) do
      "MY_PORT"
      |> System.get_env("6789")
      |> String.to_integer()
      |> accept()
    end
    
    def accept(port) do
      {:ok, socket} = :gen_tcp.listen(port, [:binary, packet: :line, active: true, reuseaddr: true])
      Logger.info "Accepting connections on port #{port}"
      loop_acceptor(socket)
    end
    

    【讨论】:

    • 我在application.ex 中做了几乎相同的事情,但我不知道如何在运行时使用不同的端口启动每个节点
    • 在不同环境的不同控制台中。
    • 因为当我打开两个节点时,它们都连接在默认端口上,我知道这可能听起来很愚蠢,但我是 elixir 的新手,你能告诉我怎么做吗?
    • 打开两个控制台,第一次运行MY_PORT=1111 iex -S mix,另一次运行MY_PORT=1112 iex -S mix
    猜你喜欢
    • 2020-01-07
    • 1970-01-01
    • 2015-12-25
    • 2018-08-15
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2021-01-30
    • 2021-05-13
    相关资源
    最近更新 更多