Perl6 中的SOCKET就是相当于Perl5 的 。
官方介绍如下:
#下面是客户端
multi method new(
:$host,
:$port,
:$family = 2,
:$encoding = 'utf-8',
:$nl-in = "
",
--> IO::Socket::INET:D)
#下面是服务端
multi method new(
:$localhost,
:$localport,
:$family = 2,
:$listen,
:$encoding = 'utf-8',
:$nl-in = "
",
--> IO::Socket::INET:D)
我们使用时, 设置我们要用的就行, 对于其他参数, 让其默认即可。
服务端:
my $listen = IO::Socket::INET.new(:listen, :localhost<localhost>, :localport(3333));
客户端:
my $conn = IO::Socket::INET.new(:host<localhost>, :port(3333));
my $s = IO::Socket::INET.new(:listen, :localhost<localhost>, :localport(1234));
loop {
my $c = $s.accept;
while (my $buf = $c.read(120 )) {
say $buf.WHAT;
say $buf.decode('utf-8');}
$c.close;
}
完整客户端例子:
my $c = IO::Socket::INET.new(:host<localhost>, :port(1234));
#my $data = prompt 'Str:';
my $data = slurp 'data.txt';
$c.print: $data;
#my $buff = $c.recv(:bin);
#say $buff;
#say $c.^methods;
$c.close;
#say $data;
这里说明几个参数。
If :$listen is True, creates a new socket that listen on $localhost (which can be an IP address or a domain name) on port $localport. Otherwise it opens a connection to $host on port $port.
如果listen设置了, 就相当于创建了一个服务端, 并且在端口localport监听。服务地址用localhost指定, 可以是域名或IP地址。
如果是客户端, 只设置host与port就行
$family defaults to 2 for IPv4, and can be set to 3 for IPv6.
如果是IP4, 默认family为2, 如果是IP6, 默认为3, 一般不要自行设置, 默认就行。 For text operations (such as method lines and method get), $encoding specifies the encoding, and $nl-in determines the character(s) that separate lines.
method get()
从SOCKET中获取一行, 返回的是Str 字符串类型。
method lines()
从SOCKET中获取多行返回一个列表。
上面的GET()/LINES()都跟文件中读取类似。
method accept()
用于服务器端,监听并受来到的连接, 并返回一个SOCKET。
SOCKET创建好后, 一般来说就是接收与发送数据了, 官方文档里的几个函数如下:
接收数据函数如下:
method recv(IO::Socket:D: Cool $elems = Inf, :$bin)
接收数据函数, 用法如下:
$connect.recv()
$connect.recv(100)
$connect.recv(:bin)
数字类型的参说, 说明只接收最多的字节数, 最后面的 :bin 参数, 是设置接收数据后的返回格式 用的。
如果 $connect.recv(:bin)设置了, 说明返回的是 Blob 数据块, 如果不设置, 就返回正常的字符串类型。
method read(IO::Socket:D: Int(Cool) $bytes)
从SOCKET中读取数据, 返回 Blob 格式。 可以设置读取的字节数, 或一次过全部读取 (如果数据超过一定长度, 用一次过读取的方法会出错 ($connect.read()), 这时改为 $connect.read(1024)这种方式读取比较好, 再用 while判断是否读取完毕), 如下所示:
while (my $buf = $c.read(1024 )) {
say $buf;
}
下面是发送数据的函数:
method print(IO::Socket:D: Str(Cool) $string)
参数为 Str 字符串类型。
用法:
$socket.print: $data
$socket.print($data)
跟文件写入类似。
method write(IO::Socket:D: Blob:D $buf)
参数为 Blob 类型。
用法跟 print 类似, 只是参数不同。
method put(IO::Socket:D: Str(Cool) $string)
跟 前两个类似, 参数为 Str 字符串类型。
最后说说 Blob, Perl6官方文档如下:
https://docs.perl6.org/type/Blob
如果你的 Socket 接收到 Blob 后, 想转化为字符串型式, 可以用如下方法:
$data.decode('utf-8')
Socket用完了, 最后就是关闭了:
method close(IO::Socket:D)
用法如下:
$socket.close;
close($socket);