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.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 上使用,并且具有特定的名称前缀模式(\ \。\管道\)。它是使用特殊文件的通信通道。
例子
我们还可以创建一个命名管道服务器,如下所示 -
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、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 条推文,您可以传递“计数”,如下所示 -
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