Как запустить iex с переменной окружения для ПОРТа ListenSocket

Я создал сервер и клиентскую часть для своего приложения, и я хочу запускать каждый узел с другим портом, я хочу сделать это с переменной среды, как это возможно? вот код сервера:

 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

и полный код здесь


person Mariem    schedule 15.09.2020    source источник


Ответы (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
person Aleksei Matiushkin    schedule 15.09.2020
comment
Я сделал почти то же самое в application.ex и я не знаю, как запустить каждый узел с разными портами во время выполнения - person Mariem; 15.09.2020
comment
На разных консолях с разным окружением. - person Aleksei Matiushkin; 15.09.2020
comment
Потому что, когда я открываю два узла, они оба подключены к порту по умолчанию, я знаю, что это может показаться глупым вопросом, но я новичок в эликсире, не могли бы вы показать мне, как это сделать? - person Mariem; 15.09.2020
comment
Откройте две консоли, в первом прогоне MY_PORT=1111 iex -S mix, в другом прогоне MY_PORT=1112 iex -S mix. - person Aleksei Matiushkin; 15.09.2020