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

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

时间:2024-02-05 16:33:57浏览次数:31  
标签:UDP Socket Eralng TCP 连接 第六天 Fun Erlang gen

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!").

标签:UDP,Socket,Eralng,TCP,连接,第六天,Fun,Erlang,gen
From: https://www.cnblogs.com/dw166/p/18008314

相关文章

  • Eralng 学习笔记第五天, 异常,宏,头文件,预处理器,模式匹配
    Erlang异常在Erlang中,有3种例外类型-Error−调用将终止当前进程的执行,并在捕获到最后一个函数及其参数时包含堆栈跟踪。这些是引发上述运行时错误的异常。erlang:error(Reason)Exists −有两种Exists:内部退出和外部退出。内部退出通过调用函数exit/1来触发,并使当前进......
  • 【Azure Function】Function本地调试时遇见跨域问题(blocked by CORS policy)
    问题描述在本地调试AzureFunction时,遇见了跨域问题:AccesstoXMLHttpRequestat'http://localhost:7071/api/HttpTriggerToken?tenantId=b7f6f99f-3045-412a-8828-b3044070857e&documentId=6a8ffc27-026f-498e-9936-f6c55db558e5&userId=test-user&userName=Test+User......
  • 【Azure Function】Function本地调试时遇见跨域问题(blocked by CORS policy)
    问题描述在本地调试AzureFunction时,遇见了跨域问题:AccesstoXMLHttpRequestat'http://localhost:7071/api/HttpTriggerToken?tenantId=b7f6f99f-3045-412a-8828-b3044070857e&documentId=6a8ffc27-026f-498e-9936-f6c55db558e5&userId=test-user&userName=Test+User&......
  • Azure Data Factory(十二)传参调用 Azure Function
    一,引言 在实际的项目中,AzureDataFactroy中的DataFlow并不能彻底帮我们完成一系列复制逻辑计算,比如我们需要针对数据集的每一行数据进行判断计算,DataFlow就显的有些吃力。别怕,AzureDataFactory提供了调用AzureFunction的组件,有了代码的加持,那么解决更复杂的都能迎......
  • Leetcode刷题第六天-回溯
    131:分割回文串链接:131.分割回文串-力扣(LeetCode)for遍历字符串递归切割,切割到字符串尾,单次结束1classSolution:2defpartition(self,s:str)->List[List[str]]:3if(nots):return[]4re=[]5self.backtracking(s,[],re,......
  • .Net Core项目部署到Azure Function
    创建AzureFunction项目在VisualStudio中,选择“新建项目”,然后选择“AzureFunctions”模板。编写Function函数代码publicstaticclassFunction1{[FunctionName("Function1")]publicstaticasyncTask<IActionResult>Run([HttpTr......
  • 【侯捷C++面向对象笔记】补充2-pointer-like & function-like class
    关键词:仿函数pointer-like:将一个类设计得像指针一样,通常通过重载*和->操作符实现。function-like:将类的成员设计得能像函数一样使用,通过重载()操作符实现。TipDemo应用:智能指针注意:->符号在作用一次后,会继续作用下去(不同于*号)Foof(*sp):f为一个Foo对象本体,使用时f.m......
  • Overview how does plpgsql function get executed
    TheSQLCREATEFUNCTIONprocess_orders()RETURNSvoidAS$$DECLAREcrecord;BEGINFORcINSELECT*FROMordersLOOPRAISENOTICE'Processing:%%',c.id,c.total;ENDLOOP;END;$$LANGUAGEplpgsql;createtableorders(idint,t......
  • 代码随想录算法训练营第六天 |242. 有效的字母异位词 349. 两个数组的交集 202. 快乐
    1.两数之和 已解答简单 相关标签相关企业 提示 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同......
  • 第六天
    packageshuzu;importjava.util.Arrays;publicclassDemo08{publicstaticvoidmain(String[]args){//创建一个二维数组。0为黑,1为白int[][]qipan=newint[11][11];qipan[1][2]=1;qipan[2][3]=2;dayin(qipan);//转化为稀疏字符intsum=0;//读取非......