首页 > 其他分享 >无涯教程-Erlang - 端口

无涯教程-Erlang - 端口

时间:2023-12-03 22:02:17浏览次数:46  
标签:udp Socket 端口 无涯 Port start io Erlang gen

在Erlang中,端口用于不同程序之间的通信,Socket是一个通信端点,允许计算机使用Internet协议(IP)通过Internet进行通信。

端口协议类型

有2种类型的协议可用于通信。一个是UDP,另一个是TCP, UDP允许应用程序相互发送短消息(称为数据报),但是不能保证这些消息的传递。他们也可能无秩序到达。另一方面,TCP提供可靠的字节流,只要创建连接就按顺序传递字节。

让我们看一个使用UDP打开端口的简单示例。

-module(helloLearnfk). 
-export([start/0]). 

start() -> 
   {ok, Socket}=gen_udp:open(8789), 
   io:fwrite("~p",[Socket]).

关于上述程序,需要注意以下几点

  • gen_udp  包含Erlang中用于UDP通信的模块。

  • 此处8789是正在Erlang中打开的端口号,您需要确保此端口号可用并且可以使用。

上面程序的输出是-

#Port<0.376>

发送消息

打开端口后,可以在该端口上发送一条消息。这是通过send方法完成的。让我们看一下语法和以下示例。

send(Socket, Address, Port, Packet)
  • Socket      -  这是使用gen_udp:open命令创建的Socket。

  • Address   -  这是必须将消息发送到的机器地址。

  • Port          -  这是需要在其上发送消息的端口号。

  • Packet      -   这是需要发送的数据包或消息详细信息。

如果消息发送正确,则返回确定消息。

-module(helloLearnfk). 
-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)
  • Socket    -  这是使用gen_udp:open命令创建的Socket。

  • length     -  这是需要接收的消息的长度。

如果消息发送正确,则返回确定消息。

-module(helloLearnfk). 
-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(helloLearnfk). 
-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个窗口中运行该程序,通过在 erl命令行窗口中运行以下代码,将使用第一个窗口来运行服务器组件。

helloLearnfk:start().

这将在命令行窗口中显示以下输出。

server opened socket:#Port<0.2314>

现在,在第二个erl命令行窗口中,运行以下命令。

HelloLearnfk:client(“<<Hello>>”).

发出此命令时,以下输出将显示在第一个命令行窗口中。

server received:<<"Hello">>

参考链接

https://www.learnfk.com/erlang/erlang-ports.html

标签:udp,Socket,端口,无涯,Port,start,io,Erlang,gen
From: https://blog.51cto.com/u_14033984/8669182

相关文章

  • 无涯教程-Erlang - 邮件
    要使用Erlang发送电子邮件,您需要使用github可用的软件包,github链接是-https://github.com/Vagabond/gen_smtp该链接包含smtp实用程序,可用于从Erlang应用程序发送电子邮件,请按照以下步骤操作,以便能够从Erlang发送电子邮件步骤1 -从github站点下载erl文件,这些文件应下......
  • 无涯教程-Erlang - 进程
    Erlang中的这些过程与大多数人熟悉的过程和线程不同,Erlang进程是轻量级的,与其他进程(内存)隔离运行,并且由Erlang的虚拟机(VM)调度。进程的创建时间非常短,刚生成的进程的内存占用非常小,单个ErlangVM可以运行数百万个进程。借助spawn方法创建一个进程。该方法的一般语法如下。s......
  • 无涯教程-Erlang - BIFS
    BIF是Erlang中内置的函数,他们通常执行无法在Erlang中编程的任务,如,不可能将列表变成元组,为了执行这样的操作,我们称为BIF。让我们举一个如何使用BIF的示例--module(helloLearnfk).-export([start/0]).start()->io:fwrite("~p~n",[tuple_to_list({1,2,3})]),io:......
  • 无涯教程-Erlang - 函数
    Fun用于在Erlang中定义匿名函数,匿名函数的一般语法如下:F=fun(Arg1,Arg2,...ArgN)->...EndF                  - 这是分配给匿名函数的变量名。Arg1,Arg2,...ArgN - 这些是传递给匿名函数的参数。以下示例展示了如何......
  • 无涯教程-Erlang - 预处理
    在编译Erlang模块之前,它会由Erlang预处理程序自动处理,预处理器会扩展源文件中可能存在的所有宏,并插入任何必要的包含文件。通常,您不需要查看预处理器的输出,但是在特殊情况下(如,调试错误的宏时),您可能希望保存预处理器的输出,要查看模块some_module.erl的预处理输出,请提供OSShe......
  • 无涯教程-Erlang - 异常处理
    任何编程语言都需要异常处理来处理运行时错误,以便可以维护应用程序的正常流程。通常,当Erlang中发生异常或错误时,将显示以下消息。{"initterminatingindo_boot",{undef,[{helloLearnfk,start,[],[]},{init,start_it,1,[]},{init,start_em,1,[]}]}}故障转储将被写入-erl_......
  • 无涯教程-Erlang - Records(记录)
    Erlang具有创建records记录函数,这些records记录由字段组成,例如,您可以定义一个personal records,其中包含2个字段,一个是id,另一个是name字段。然后,您可以在Erlang中创建此records记录的各种实例,以定义具有不同名称和ID的多个personal。创建记录使用record标识符创建,在此record......
  • 无涯教程-Erlang - Maps(映射)
    Maps中的每个键-值(key-value)关联称为关联对,该对中的键和值部分称为元素,关联对的数量被称为Map的大小。我们定义了具有2个Maps的MapM1,map_size是用Erlang定义的内置函数,可用于查看Map的大小。-module(helloLearnfk).-export([start/0]).start()->M1=#{name=>john......
  • 无涯教程-Erlang - 文件I/O
    使用I/O时,Erlang提供了许多方法。它具有更简单的类,可为文件提供以下函数-读取文件写入文件查看文件是文件还是目录让我们探讨一下Erlang提供的一些文件操作,出于这些示例的目的,我们将假设有一个名为NewFile.txt的文件,其中包含以下文本行Example1Example2Example3在以下......
  • 无涯教程-Erlang - Strings(字符串)
    通过将字符串括在引号中,可以在Erlang中构造一个字符串文字,需要使用双引号(如"HelloLearnfk")构造Erlang中的字符串。-module(helloLearnfk).-export([start/0]).start()->Str1="Thisisastring",io:fwrite("~p~n",[Str1]).上面程序的输出将是-“Thisisa......