[Julia] 网络和流
IOStream 输入输出流
代码 | stdin | stdout | stderr |
---|---|---|---|
含义 | 标准输入流 | 标准输出流 | 标准输出错误流 |
- stdin: 程序通过stdin读取用户输入的数据(例如 readline())
- stdout: 程序通过 stdout 输出正常结果 (例如println(“Hello”))
- stderr: 专门用于输出错误信息和警告 例如 (@error) 确保错误信息不被正常输出淹没。
三者均为全局常量,无特殊情况尽量不调用不变更这三个变量
,避免不必要的麻烦。
stdout 默认行缓冲, 遇到换行符或者缓冲区满时刷新
stderr 默认无缓冲,及时输出,避免错误信息延迟
write(stdout, "Hello") # 输出到屏幕
data = read(stdin, Char) # 从键盘读取输入的字符
TCP 概念
TCP(Transmission Control Protocol,传输控制协议)是互联网协议套件(TCP/IP)中的核心传输层协议,主要用于在网络中提供可靠的、面向连接的、基于字节流的数据传输服务。
Julia 实现简单的 TCP 例子
让我们直接进入一个 TCP 套接字相关的简单示例。此功能位于名为 Sockets 的标准库中。让我们先创建一个简单的服务器:
using Sockets
errormonitor(@async begin # 异步并行server = listen(2000)while true # 始终运行的死循环sock = accept(server)println("Hello World\n")end
end)
Task (runnable) @0x000000000e1d03f0
从通道 ip"::1" 监听接口 2000
listen(ip"::1",2000)
Sockets.TCPServer(Base.Libc.WindowsRawSocket(0x00000000000003c4) active)
返回接口 2000 代码的运行结果
connect(2000)
Hello World
TCPSocket(Base.Libc.WindowsRawSocket(0x0000000000000544) open, 0 bytes waiting)
附带停机功能的 TCP 例子
using Sockets
# 启动异步服务器
server = listen(2000)
task = @async begintrywhile isopen(server) # 检查 server 是否仍开启sock = accept(server)println("Hello World")close(sock) # 关闭客户端连接endcatch eisa(e, Base.IOError) || rethrow() # 忽略因关闭 server 引发的 IOErrorend
end
- 监听接口 2000
connect(2000)
Hello World
- 停止服务器:关闭监听套接字, 再尝试监听
close(server)
connect(2000)
ERROR: IOError: connect: connection refused (ECONNREFUSED)
解析 IP 地址
using Sockets
connect("www.csdn.net", 80)
getaddrinfo("www.csdn.net")
ip"xxx.xxx.xxx.xxx"
不同的域名因为协议不同会有不同的ip地址格式
异步 I/O
用异步并行宏 @async 将字符串 “Hello, World!” 写入 “foo.txt” 文件
task = @async open("foo.txt", "w") do io # @async 异步并行write(io, "Hello, World!")end;
wait(task)
readlines("foo.txt")
1-element Vector{String}:
“Hello, World!”
如果给多个任务,更容易观察到异步特点:
@async for hostname in ("bing.com", "cn.julialang.org", "www.csdn.net")@async beginconn = connect(hostname, 80)write(conn, "GET / HTTP/1.1\r\nHost:$(hostname)\r\n\r\n")readline(conn, keep=true)println("Finished connection to $(hostname)")endend
Finished connection to www.csdn.net
Finished connection to bing.com
Finished connection to cn.julialang.org
从输出结果不难发现尽管最后安排与 CSDN 通信, 但是 CSDN 是第一个返回信息的。