Perl6 中的SOCKET就是相当于Perl5 的 。
官方介绍如下:
#下面是客户端 multi method new( :$host, :$port, :$family = 2, :$encoding = 'utf-8', :$nl-in = "\r\n", --> IO::Socket::INET:D) #下面是服务端multi method new( :$localhost, :$localport, :$family = 2, :$listen, :$encoding = 'utf-8', :$nl-in = "\r\n", --> IO::Socket::INET:D)
我们使用时, 设置我们要用的就行, 对于其他参数, 让其默认即可。
服务端:
my $listen = IO::Socket::INET.new(:listen, :localhost, :localport(3333));
客户端:
my $conn = IO::Socket::INET.new(:host, :port(3333));
my $s = IO::Socket::INET.new(:listen, :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, :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官方文档如下:
如果你的 Socket 接收到 Blob 后, 想转化为字符串型式, 可以用如下方法:
$data.decode('utf-8')
Socket用完了, 最后就是关闭了:
method close(IO::Socket:D)
用法如下:
$socket.close;close($socket);