Учебники

Эрланг — Порты

В Erlang порты используются для связи между различными программами. Сокет — это конечная точка связи, которая позволяет компьютерам обмениваться данными через Интернет с использованием Интернет-протокола (IP).

Типы протоколов, используемых в портах

Для связи доступно 2 типа протоколов. Один — UDP, а другой — TCP. UDP позволяет приложениям отправлять друг другу короткие сообщения (так называемые датаграммы), но нет гарантии доставки этих сообщений. Они также могут прибыть из строя. TCP, с другой стороны, обеспечивает надежный поток байтов, которые доставляются в порядке, пока установлено соединение.

Давайте рассмотрим простой пример открытия порта с использованием UDP.

пример

Live Demo

 модуль (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» возвращается, если сообщение было отправлено правильно.

Например

Live Demo

-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)]).

Полная программа

Теперь очевидно, что в одной и той же программе нельзя отправлять и получать одно и то же сообщение. Вы должны определить их в разных программах. Итак, давайте создадим следующий код, который создает серверный компонент, который слушает сообщения, и клиентский компонент, который отправляет сообщения.

пример

Live Demo

-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>>”).

Когда вы вводите эту команду, в первом окне командной строки будут отображаться следующие выходные данные.