Erlang - 端口

Erlang - 端口 首页 / Erlang入门教程 / Erlang - 端口

在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中打开的端口号,您需要确保此端口号可用并且可以使用。

上面程序的输出是-

链接:https://www.learnfk.comhttps://www.learnfk.com/erlang/erlang-ports.html

来源:LearnFk无涯教程网

#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">>

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

机器学习40讲 -〔王天一〕

技术管理实战36讲 -〔刘建国〕

Linux性能优化实战 -〔倪朋飞〕

Selenium自动化测试实战 -〔郭宏志〕

动态规划面试宝典 -〔卢誉声〕

实用密码学 -〔范学雷〕

大数据经典论文解读 -〔徐文浩〕

计算机基础实战课 -〔彭东〕

云原生架构与GitOps实战 -〔王炜〕

好记忆不如烂笔头。留下您的足迹吧 :)