博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
perl6 Socket
阅读量:5140 次
发布时间:2019-06-13

本文共 2776 字,大约阅读时间需要 9 分钟。

Perl6 中的SOCKET就是相当于Perl5 的 IO::Socket::INET

官方介绍如下:

#下面是客户端 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);

 

 

 

 

 

转载于:https://www.cnblogs.com/perl6/p/7403161.html

你可能感兴趣的文章
Delphi中Json格式读写
查看>>
请不要忘记带着梦想时常沐浴阳光
查看>>
交易与风险
查看>>
Hibernate: Could not find a getter for iUserId in class com.Hibernate.pojo.User异常
查看>>
windows环境下搭建RocketMQ
查看>>
CSS--基础
查看>>
基于OpenGL的渲染引擎
查看>>
Android HTTP GET 小文件下载
查看>>
ember.js:使用笔记4 数组数据的分组显示
查看>>
mvc-9测试和调试
查看>>
移植linux-2.6.32.2到qq2440
查看>>
转义字符(\)对JavaScript中JSON.parse的影响概述
查看>>
MySQL学习9 - 单表查询
查看>>
利用kubeadm部署k8s
查看>>
如何在MVC中显示条形码图片(以内存流的方式)
查看>>
解析文件夹下的所有二维码,并输出二维码中的信息
查看>>
高精度加减
查看>>
表单验证
查看>>
python细节2
查看>>
游戏引擎 Unity 的入门易精通难体现在哪?为什么?
查看>>