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.jlstreams.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 支持以下消息传递方法 −

E-mail

电子邮件是最古老的消息传递方法之一。 电子邮件消息可以通过两种方式完成 −

  • 发送电子邮件 − 它发生在众所周知的端口 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)

Twitter

除了电子邮件之外,还有其他发送 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