Eralng 学习笔记第六天, Fun,进程,电子邮件,数据库,端口

Erlang Fun  示例:

-module(helloworld). 
-export([start/0]). 
start() ->     A = fun(X) ->        io:fwrite("~p~n",[X])        end,     A(5).
输出 5
---------------------------------------------------
-module(helloworld). 
-export([start/0]). 

start() -> 
   Adder = fun(X) -> fun(Y) -> io:fwrite("~p~n",[X + Y]) end end, 
   A = Adder(6), 
   A(10).
输出 16

Erlang 进程

Erlang中的并发粒度是一个过程。流程是与其他流程同时运行并独立于其他流程的活动/任务。Erlang中的这些过程与大多数人所熟悉的过程和线程不同。Erlang进程是轻量级的,与其他进程(内存)隔离运行,并且由Erlang的虚拟机(VM)调度。进程的创建时间非常短,刚生成的进程的内存占用非常小,单个Erlang VM可以运行数百万个进程。

语法: spawn(Module, Name, Args)   参数 Module  - 这是预定义的原子值,必须为 ?MODULE  ,   Name-这是定义流程时要调用的函数名称  , Args - 这些是需要发送给函数的参数

-module(helloworld). 
-export([start/0, call/2]). 

call(Arg1, Arg2) -> 
   io:format("~p ~p~n", [Arg1, Arg2]). 
start() -> 
   Pid = spawn(?MODULE, call, ["hello", "process"]), 
   io:fwrite("~p",[Pid]).

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

  • 定义了一个称为call的函数,该函数将用于创建过程。

  • spawn方法使用参数hello和process调用call函数。

输出结果 :  <0.29.0>"hello" "process"

Erlang 电子邮件

要使用Erlang发送电子邮件,您需要使用来自github的可用软件包。github链接是-https: //github.com/Vagabond/gen_smtp

 

Erlang 数据库

 演示如何在Erlang中使用 emysql 库连接到 MySQL 数据库并执行查询操作:

例子:

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

start() ->
  %% 连接到 MySQL 数据库
  {ok, Conn} = emysql:add_connection_pool(<<"my_pool">>, [{host, "localhost"}, {user, "username"}, {password, "password"}, {database, "my_database"}]),

  %% 执行查询
  Query = <<"SELECT * FROM my_table">>,
  {ok, Result} = emysql:execute(<<"my_pool">>, Query),

 

  %% 处理查询结果
  case Result of
    {selected, Rows} ->
      %% 打印查询结果
      lists:foreach(fun(Row) -> io:format("~p~n", [Row]) end, Rows);
    _ ->
      io:format("No rows selected.~n")
  end,

    %% 关闭连接
    ok = emysql:close_connection_pool(<<"my_pool">>).

 

在这个例子中,我们首先使用 emysql:add_connection_pool/2 函数建立与 MySQL 数据库的连接池,然后执行一个简单的 SELECT 查询。

查询结果会被打印到控制台上。最后,我们使用 emysql:close_connection_pool/1 函数关闭连接池。

在实际项目中,你需要将 usernamepasswordhostdatabasemy_table 替换为你的 MySQL 数据库的实际参数。

 

Erlang 端口

 

TCP(传输控制协议)和UDP(用户数据报协议)是两种常用的网络传输协议,它们在数据传输方式和特性上有明显的区别:

  1. TCP(传输控制协议):

    • 面向连接:TCP是一种面向连接的协议,通信双方在数据传输之前需要建立连接,并在连接上进行数据的可靠传输。
    • 可靠性:TCP提供可靠的数据传输服务,确保数据的完整性、有序性和可靠性。它通过序列号、确认应答和重传机制来实现数据的可靠传输。
    • 流式传输:TCP采用流式传输方式,将数据视为字节流进行传输,保证数据按顺序到达接收端,并提供流量控制和拥塞控制机制。
    • 连接管理:TCP连接的建立和维护需要消耗一定的资源,包括三次握手建立连接和四次挥手关闭连接等过程。
  2. UDP(用户数据报协议):

    • 无连接:UDP是一种无连接的协议,通信双方之间不需要建立连接,数据在发送端封装成数据报后直接发送给接收端,不需要等待确认应答。
    • 不可靠性:UDP提供不可靠的数据传输服务,不保证数据的完整性和可靠性。它不提供重传机制,数据可能会丢失或乱序到达接收端。
    • 数据报传输:UDP采用数据报传输方式,将数据封装成数据报进行传输,每个数据报都是独立的,没有顺序要求,也没有拥塞控制机制。
    • 低延迟:由于无连接和不可靠性,UDP传输延迟较低,适用于对实时性要求较高的应用场景。

如何使用这两种协议取决于具体的应用需求和场景:

  • 如果对数据的完整性和可靠性要求较高,例如文件传输、网页浏览等应用,建议使用TCP协议。
  • 如果对实时性要求较高,例如实时音视频传输、在线游戏等应用,可以考虑使用UDP协议。
  • 有时也会根据应用的特点结合使用两种协议,例如TCP用于稳定的数据传输,UDP用于实时的数据传输。

接下来是一个简单的Erlang示例,演示如何使用TCP和UDP协议进行简单的数据传输。

TCP协议示例:

-module(tcp_example).
-export([server/0, client/0]).

server() ->
  {ok, ListenSocket} = gen_tcp:listen(12345, [{active, false}]),
  {ok, Socket} = gen_tcp:accept(ListenSocket),
  gen_tcp:recv(Socket, 0).

client() ->
  {ok, Socket} = gen_tcp:connect("localhost", 12345, []),
  gen_tcp:send(Socket, "Hello, TCP!").

 

UDP协议示例:

-module(udp_example).
-export([server/0, client/0]).

server() ->
  {ok, Socket} = gen_udp:open(12345, [{active, once}]),
  receive
    {udp, Socket, _, _, Data} ->
      io:format("Received UDP data: ~s~n", [Data])
  end.

client() ->
  {ok, Socket} = gen_udp:open(0),
  gen_udp:send(Socket, "localhost", 12345, "Hello, UDP!").

posted @ 2024-02-05 16:27  d-w  阅读(18)  评论(0编辑  收藏  举报