В Erlang порты используются для связи между различными программами. Сокет — это конечная точка связи, которая позволяет компьютерам обмениваться данными через Интернет с использованием Интернет-протокола (IP).
Типы протоколов, используемых в портах
Для связи доступно 2 типа протоколов. Один — UDP, а другой — TCP. UDP позволяет приложениям отправлять друг другу короткие сообщения (так называемые датаграммы), но нет гарантии доставки этих сообщений. Они также могут прибыть из строя. TCP, с другой стороны, обеспечивает надежный поток байтов, которые доставляются в порядке, пока установлено соединение.
Давайте рассмотрим простой пример открытия порта с использованием UDP.
пример
модуль (HelloWorld). -export ([старт / 0]). start () -> {ok, Socket} = gen_udp: open (8789), Io: FWRITE ( "~ р", [гнездо]).
Следующие вещи должны быть отмечены о вышеупомянутой программе
-
Gen_udp содержит модули в Erlang, используемые для связи UDP.
-
Здесь 8789 — номер порта, который открывается в Erlang. Вы должны убедиться, что этот номер порта доступен и может использоваться.
Gen_udp содержит модули в Erlang, используемые для связи UDP.
Здесь 8789 — номер порта, который открывается в Erlang. Вы должны убедиться, что этот номер порта доступен и может использоваться.
Выход вышеуказанной программы —
#Port<0.376>
Отправка сообщения в порт
После открытия порта на него можно отправить сообщение. Это делается с помощью метода отправки. Давайте посмотрим на синтаксис и следующий пример.
Синтаксис
send(Socket, Address, Port, Packet)
параметры
-
Сокет — это сокет, созданный с помощью команды gen_udp: open.
-
Адрес — это адрес компьютера, на который должно быть отправлено сообщение.
-
порт — это номер порта, на который необходимо отправить сообщение.
-
Пакет — это детали пакета или сообщения, которые необходимо отправить.
Сокет — это сокет, созданный с помощью команды gen_udp: open.
Адрес — это адрес компьютера, на который должно быть отправлено сообщение.
порт — это номер порта, на который необходимо отправить сообщение.
Пакет — это детали пакета или сообщения, которые необходимо отправить.
Возвращаемые значения
Сообщение «OK» возвращается, если сообщение было отправлено правильно.
Например
-module(helloworld). -export([start/0]). start() -> {ok, Socket} = gen_udp:open(8789), io:fwrite("~p",[Socket]), io:fwrite("~p",[gen_udp:send (Socket,"localhost",8789,"Hello")]).
Выход
Вывод вышеуказанной программы будет следующим.
#Port<0.376>ok
Получение сообщения в порту
После открытия порта на порт также можно получить сообщение. Это делается с помощью метода recv . Давайте посмотрим на синтаксис и следующий пример.
Синтаксис
recv(Socket, length)
параметры
-
Сокет — это сокет, созданный с помощью команды gen_udp: open.
-
Длина — это длина сообщения, которое необходимо получить.
Сокет — это сокет, созданный с помощью команды gen_udp: open.
Длина — это длина сообщения, которое необходимо получить.
Возвращаемые значения
Сообщение «OK» возвращается, если сообщение было отправлено правильно.
Например
-module(helloworld). -export([start/0]). start() -> {ok, Socket} = gen_udp:open(8789), io:fwrite("~p",[Socket]), io:fwrite("~p",[gen_udp:send(Socket,"localhost",8789,"Hello")]), io:fwrite("~p",[gen_udp:recv(Socket, 20)]).
Полная программа
Теперь очевидно, что в одной и той же программе нельзя отправлять и получать одно и то же сообщение. Вы должны определить их в разных программах. Итак, давайте создадим следующий код, который создает серверный компонент, который слушает сообщения, и клиентский компонент, который отправляет сообщения.
пример
-module(helloworld). -export([start/0,client/1]). start() -> spawn(fun() -> server(4000) end). server(Port) -> {ok, Socket} = gen_udp:open(Port, [binary, {active, false}]), io:format("server opened socket:~p~n",[Socket]), loop(Socket). loop(Socket) -> inet:setopts(Socket, [{active, once}]), receive {udp, Socket, Host, Port, Bin} -> io:format("server received:~p~n",[Bin]), gen_udp:send(Socket, Host, Port, Bin), loop(Socket) end. client(N) -> {ok, Socket} = gen_udp:open(0, [binary]), io:format("client opened socket=~p~n",[Socket]), ok = gen_udp:send(Socket, "localhost", 4000, N), Value = receive {udp, Socket, _, _, Bin} -> io:format("client received:~p~n",[Bin]) after 2000 -> 0 end, gen_udp:close(Socket), Value.
Следующие вещи необходимо отметить о вышеупомянутой программе.
-
Мы определяем 2 функции, первая — серверная. Это будет использоваться для прослушивания порта 4000. Второй — это клиент, который будет использоваться для отправки сообщения «Hello» компоненту сервера.
-
Цикл приема используется для чтения сообщений, отправленных в цикле определения.
Мы определяем 2 функции, первая — серверная. Это будет использоваться для прослушивания порта 4000. Второй — это клиент, который будет использоваться для отправки сообщения «Hello» компоненту сервера.
Цикл приема используется для чтения сообщений, отправленных в цикле определения.
Выход
Теперь вам нужно запустить программу из 2 окон. Первое окно будет использоваться для запуска серверного компонента путем запуска следующего кода в окне командной строки erl .
helloworld:start().
Это отобразит следующий вывод в окне командной строки.
server opened socket:#Port<0.2314>
Теперь во втором окне командной строки erl выполните следующую команду.
Helloworld:client(“<<Hello>>”).
Когда вы вводите эту команду, в первом окне командной строки будут отображаться следующие выходные данные.