Julia 编程 - 网络
套接字和服务器
为了处理流式 I/O 对象,例如管道、TCP 套接字、终端等,我们需要 Julia 提供的丰富接口。 尽管该 Julia 接口是在系统级别异步呈现的,但它还是以同步方式提供给程序员。
优点是程序员不需要考虑底层的异步操作。 在深入讨论之前,我们应该了解知名端口的概念。
特定端口
特定端口及其上的网络服务的概念是由伯克利开发于 20 世纪 80 年代初引入的。 它首先被引入到 Unix 中。 这背后的基本想法是 −
特定的网络服务应与特定的端口号关联。
网络数据包应使用该端口号标记发送。
一些众所周知的端口如下 −
端口21文件传输协议
端口 22-SSH
端口 25-sendmail
端口 80 网络服务器用于传送 HTTP 内容
端口3306-MySQL数据库常用
端口28017-MongoDB服务器常用
端口 6379 - 存储 Redis 键值
Julia 的 UDP 和 TCP 套接字
互联网协议(IP)指定以下两种类型的套接字 −
Unreliable
Unreliable(不可靠)套接字的概念在于,某些请求如果不得到服务,将被忽略并退出。 例如,向 NNTP 服务器请求网络时间。 所有这些类型的套接字都是无连接的,并通过 UDP(用户数据报协议)进行操作。
Reliable(可靠)
Reliable(可靠)套接字的概念与不可靠套接字相反。 它们连接已满并通过 TCP(传输控制协议)进行操作。
Julia 支持这两种套接字(UDP 和 TCP),源代码在 socket.jl 和 streams.jl 基本模块中提供。
示例
在下面给出的示例中,我们将创建一个涉及 TCP 套接字的简单服务器 −
julia> using Sockets julia> @async begin server = listen(ip"127.0.0.1",2000) while true sock = accept(server) println("This is TCP server example\n") end end julia> connect(2000) This is TCP server example
命名管道
命名管道或 UNIX 域套接字是一种 FIFO(先进先出)流,是 Unix 和 OS X 上传统管道机制的扩展。它在 Windows 上也可用,并且具有特定的名称模式 前缀 (\\.\pipe\)。 它是使用特殊文件的通信通道。
示例
我们还可以创建一个命名管道服务器,如下所示 −
julia> using Sockets julia> @async begin server = listen("\\\\.\\pipe\\testsocket") while true sock = accept(server) println("This is a named pipe server example\n") end end julia> connect(2000) This is a named pipe server example
TCP Web 服务
网络浏览器的功能与回显服务器(我们在本节前面开发的)的功能不同。 一个重要的区别是 Web 服务器应该能够返回不同的文件格式(JPEG、PNG、GIF、TXT 等),并且浏览器应该能够区分它们。
示例
以下示例将从文本文件中以纯文本形式返回随机引用 −
julia> function web_server(sock::Integer) foo = open("/Users/Leekha/Desktop/Hello.txt"); header = """HTTP/1.1 200 OK Content-type: text/plain; charset=us-ascii """ ; wb = readlines(foo); close(foo); wn = length(wb); @async begin server = listen(sock) while true wi = rand(1:wn) ws = chomp(wb[wi]) sock = accept(server) println(header*ws) end end end web_server (generic function with 1 method) julia> web_server(8080) Task (runnable) @0x0000000014bae570 julia> conn = connect(8080) HTTP/1.1 200 OK Content-type: text/plain; charset=us-ascii Hello, This is Tutorialspoint TCPSocket(Base.Libc.WindowsRawSocket(0x00000000000003f8) open, 0 bytes waiting)
Julia 网络组
网络浏览器主要是用属性来构建的,以响应对浏览器发出的请求。 在这里,我们将讨论如何通过 HTTP 请求与 Web 交互(用于获取数据以及将数据发布到 Web)。
首先,我们需要导入Requests.jl包,如下 −
Pkg.add(“Requests”)
接下来,导入必要的模块,即 get 和 post,如下所示 −
import Requests: get, post
使用GET请求从指定的Web浏览器请求数据,如下所示 −
get(“url of the website”)
如果要从网站内指定的网页进行请求,请使用如下查询参数 −
get(“url of the website”; query = Dict(“title”=>”pagenumber/page name”))
我们还可以设置 GET 请求的超时,如下所示 −
get(“url of the website”; timeout = 0.2)
我们可以使用以下命令来避免您的请求重复重定向到不同的网站 −
get(“url of the website”; max_redirects = 2)
使用以下命令可防止网站重定向您的 GET 请求 −
get(“url of tcommand he website”; allow_redirects = false)
要发送 post 请求,我们必须使用以下命令 −
post(“url of the website”)
使用下面的命令,我们可以通过 POST 请求将数据发送到网络浏览器 −
post(“url of the website”, data = “Data to be sent”)
让我们看看如何通过 POST 请求将会话 cookie 等数据发送到 Web 浏览器 −
post(“url of the website”, cookies = Dict(“sessionkey”=> “key”)
文件也可以通过以下方式发送 −
file = "book.jl" post("url of the website"; files = [FileParam(file), "text/julia", "file_name", "file_name.jl"])
WebSockets
我们熟悉称为 AJAX(异步 JavaScript 和 XML)的方法。 此方法的示例可以是我们在搜索框中键入内容的过程,服务器返回一组建议,并且它们会随着搜索词的细化而改变。 由此可见,HTTP协议的开销使用是非常高的。
Web Sockets 结合了 UDP 和 TCP 的部分,是解决这个问题的方法。 因此,Web 套接字是基于消息的(例如 UDP),并且是可靠的(例如 TCP)。 它使用普通的 HTTP/HTTPS 端口,分别是端口 80 和端口 443。 它们是聊天服务车辆的理想选择。 Julia 提供了一个名为 websockets.jl 的包。
消息传递
Julia 支持以下消息传递方法 −
电子邮件是最古老的消息传递方法之一。 电子邮件消息可以通过两种方式完成 −
发送电子邮件 − 它发生在众所周知的端口 25 上。其他一些端口(例如 465 和 587)也可以用于此目的。 SMTP(简单邮件传输协议)包括制定 SMTP 服务器可以理解的消息,用于发送电子邮件。 收件人:,发件人:和主题:,所有这些都应与邮件一起存放在邮件服务的出站队列中。
接收电子邮件 − 这与发送电子邮件有点不同。 它基本上取决于 POP(邮局协议)或 IMAP(互联网消息访问协议)。
示例
以下代码可用于发送电子邮件 −
using SMTPClient opt = SendOptions( isSSL = true, username = "g*****@gmail.com", passwd = "yourgmailpassword") body = IOBuffer( "Date: Fri, 25 Sep 2020 19:44:35 +0100\r\n" * "From: You <you@gmail.com>\r\n" * "To: me@test.com\r\n" * "Subject: Test_email\r\n" * "\r\n" * "Test Message\r\n") url = "smtps://smtp.gmail.com:465" rcpt = ["<me@gmail.com>", "<foo@gmail.com>"] from = "<you@gmail.com>" resp = send(url, rcpt, from, body, opt)
除了电子邮件之外,还有其他发送 SMS 文本信息的系统。 其中之一是 Twitter。 Julia 提供了一个名为 Twitter.jl 的包来使用 Twitter API。 要在 Julia 上使用 Twitter,我们需要进行身份验证。 为了进行身份验证,我们需要首先在 dev.twitter.com 上创建一个应用程序。 设置应用程序后,我们将能够访问 Consumer_key、consumer_token、oauth_token 和 oauth_secret。
using Twitter twitterauth("1234567nOtp...", "1234sES96S...", "45750-Hjas...", "Uonhjlmkmj...")
如果您想向所有 Twitter 关注者问好,请使用以下代码 −
post_status_update("Hello")
如果你想搜索包含 #TutorialsPoint 标签的推文,函数调用如下 −
my_tweets = get_search_tweets("#TutorialsPoint")
默认情况下,Twitter API 将返回包含上述搜索标签的 15 条最新推文。
假设你想返回最近 50 条推文,你可以传递"count",如下 −
my_tweets_50 = get_search_tweets("#TutorialsPoint"; options = {"count" => "50"})
DataFrame方法可以定义如下 −
df_tweets = DataFrame(my_tweets_50)
云服务
Julia 提供以下云服务 −
AWS.jl 包
AWS.jl 包是 Amazon Web Services 的 Julia 接口。 它取代了 AWSCore.jl(提供低级别)和 AWSSDK.jl(提供高级别)软件包。 AWS.jl 包 −
包括自动代码生成,以确保所有新的 AWS 服务可用。
使现有服务保持最新。
我们可以使用以下代码安装这个包 −
julia> Pkg.add("AWS")
AWS.jl 包可用于低级和高级 API 请求。 以下是支持的服务 −
EC2
S3
SQS
自动缩放
AWSEnv
AWSEnv 的结构如下 −
type AWSEnv aws_id::String # AWS Access Key id aws_seckey::String # AWS Secret key for signing requests aws_token::String # AWS Security Token for temporary credentials region::String # region name ep_scheme::String # URL scheme: http or https ep_host::String # region endpoint (host) ep_path::String # region endpoint (path) sig_ver::Int # AWS signature version (2 or 4) timeout::Float64 # request timeout in seconds, Default is 0.0 dry_run::Bool # If true, no actual request will be made dbg::Bool # print request and raw response to screen end
构造函数
以下是AWS中的构造函数 −
AWSEnv(; id=AWS_ID, key=AWS_SECKEY, token=AWS_TOKEN, ec2_creds=false, scheme="https", region=AWS_REGION, ep="", sig_ver=4, timeout=0.0, dr=false, dbg=false)
Here,
AWS_ID 和 AWS_SECKEY 均从 env 初始化。
AWS_TOKEN − 默认情况下它是一个空字符串。
ec2_creds − 应将其设置为 true 以自动检索临时安全凭证。
region − 应将其设置为 AWS 区域名称字符串之一。
ep − 它可以包含 AWS 端点的主机名和路径名。
sig_ver − 为签名版本,必须设置为2或4。
二进制依赖项
使用 AWS 之前必须安装以下内容 −
libz
libxm2