#erlang #elixir #gen-tcp
#erlang #elixir #gen-tcp
Вопрос:
Я создал серверную и клиентскую части для своего приложения, и я хочу запустить каждый узел с другим портом, я хочу сделать это с помощью переменной среды, как это возможно? вот код сервера :
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
и полный код находится здесь
Ответ №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
Комментарии:
1. Я сделал почти то же самое в application.ex , и я не знаю, как запустить каждый узел с разными портами во время выполнения
2. На разных консолях с разными средами.
3. Потому что, когда я открываю два узла, они оба подключены к порту по умолчанию, я знаю, что это может показаться глупым вопросом, но я новичок в elixir, не могли бы вы показать мне, как, пожалуйста?
4. Откройте две консоли, в первом запуске
MY_PORT=1111 iex -S mix
, в другом запускеMY_PORT=1112 iex -S mix
.