Julia 编程 - 网络


套接字和服务器

为了处理流式 I/O 对象,例如管道、TCP 套接字、终端等,我们需要 Julia 提供的丰富接口。尽管该 Julia 接口是在系统级别异步呈现的,但它还是以同步方式提供给程序员。

优点是程序员不需要考虑底层的异步操作。在深入讨论之前,我们应该了解知名端口的概念。

知名港口

著名端口及其上的网络服务的概念是由 Berkeley 开发于 20 世纪 80 年代初引入的。它首先被引入到 Unix 中。这背后的基本想法是 -

  • 特定的网络服务应与特定的端口号相关联。

  • 并且网络数据包应该用该端口号标记发送。

一些著名的端口如下 -

  • 端口21-文件传输协议

  • 端口 22-SSH

  • 端口25-sendmail

  • 用于传送 HTTP 内容的端口 80-Web 服务器

  • 3306端口——MySQL数据库常用

  • 端口28017-MongoDB服务器常用

  • 端口 6379 - 存储 Redis 键值

Julia 的 UDP 和 TCP 套接字

互联网协议(IP)指定以下两种类型的套接字 -

不可靠

不可靠套接字的概念在于,某些请求如果不得到服务,将被忽略并退出。例如,向 NNTP 服务器请求网络时间。所有这些类型的套接字都是无连接的,并通过 UDP(用户数据报协议)进行操作。

可靠的

可靠套接字的概念与不可靠套接字相反。它们连接已满并通过 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 上使用,并且具有特定的名称前缀模式(\ \。\管道\)。它是使用特殊文件的通信通道。

例子

我们还可以创建一个命名管道服务器,如下所示 -

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 浏览器的功能与回显服务器(我们在本节前面开发的)的功能不同。一个重要的区别是 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)

朱莉娅网络集团

Web浏览器主要是用属性来构建的,以响应对浏览器发出的请求。在这里,我们将讨论如何通过 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(“url of the website”)

使用下面的命令,我们可以通过 POST 请求将数据发送到 Web 浏览器 -

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 文本信息的系统。其中之一是推特Julia 提供了一个名为Twitter.jl的包来使用 Twitter API。要在 Julia 上使用 Twitter,我们需要进行身份验证。为了进行身份验证,我们需要首先在 dev.twitter.com 上创建一个应用程序。设置应用程序后,我们将能够访问 Consumer_key、c​​onsumer_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 条推文,您可以传递“计数”,如下所示 -

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

  • 质量安全体系

  • 自动缩放

AWS环境

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)

这里,

  • AWS_ID 和 AWS_SECKEY均从env初始化。

  • AWS_TOKEN - 默认情况下是一个空字符串。

  • ec2_creds - 应设置为 true 以自动检索临时安全凭证。

  • 区域- 应将其设置为 AWS 区域名称字符串之一。

  • ep - 它可以包含 AWS 端点的主机名和路径名。

  • sig_ver - 它是签名版本,必须设置为 2 或 4。

二进制依赖关系

使用 AWS 之前必须安装以下内容 -

  • 库兹

  • 库xm2

谷歌云

GoogleCloud.jl 是使用 Julia 包装 GCP(Google Cloud Platform)API 的模块。

先决条件

以下是 Google Cloud 的一些先决条件 -

  • 如果您还没有 Google 帐户,请创建一个。

  • 需要登录GCP 控制台

  • 您需要创建一个新项目。单击页面顶部的“项目”下拉菜单。

  • 您需要首先从 GCP 凭证页面获取与您的项目关联的凭证(JSON 文件)。

  • 将此 json 文件保存到本地计算机。

与 Julia 的 API 交互

首先安装 GoogleCloud,jl 软件包如下 -

Pkg.add(“GoogleCloud”)
using GoogleCloud

现在我们需要加载从 Google 帐户获取的服务帐户凭据 -

creds = GoogleCredentials(expanduser("put here address of .json file"))

创建一个会话如下 -

session = GoogleSession(creds, ["devstorage.full_control"])

通过使用 set_session,设置 API 的默认会话 -

set_session!(storage, session)

您可以列出现有项目中的所有存储桶,如下所示 -

bkts = storage(:Bucket, :list)
for item in bkts
   display(item)
   println()
end

现在让我们创建一个名为 foo_bkt 的新存储桶,如下所示 -

storage(:Bucket, :insert; data=Dict(:name => "foo_bkt"))
bkts = storage(:Bucket, :list)
for item in bkts
   display(item)
   println()
end

您可以列出 foo_bkt 中的所有对象 -

storage(:Object, :list, "foo_bkt")

您可以按如下方式删除存储桶 -

storage(:Bucket, :delete, "foo_bkt")
bkts = storage(:Bucket, :list)
for item in bkts
   display(item)
   println()
end