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

官方介绍如下:

#下面是客户端
multi method new(
:$host,
:$port,
:$family = ,
:$encoding = 'utf-8',
:$nl-in = "\r\n",
--> IO::Socket::INET:D) #下面是服务端
multi method new(
:$localhost,
:$localport,
:$family = ,
:$listen,
:$encoding = 'utf-8',
:$nl-in = "\r\n",
--> IO::Socket::INET:D)

我们使用时, 设置我们要用的就行, 对于其他参数, 让其默认即可。

服务端:

my $listen = IO::Socket::INET.new(:listen, :localhost<localhost>, :localport());

客户端:

my $conn = IO::Socket::INET.new(:host<localhost>, :port());

完整服务端例子:
my $s = IO::Socket::INET.new(:listen, :localhost<localhost>, :localport());
loop {
my $c = $s.accept;
while (my $buf = $c.read( )) {
say $buf.WHAT;
say $buf.decode('utf-8');}
$c.close;
}

完整客户端例子:

my $c = IO::Socket::INET.new(:host<localhost>, :port());
#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 for IPv4, and can be set to 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()

$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( )) {
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);

perl6 Socket的更多相关文章

  1. perl6 Socket: 发送HTTP请求

    sub MAIN(Str $host,Str $path, Int $port) { my $send = "GET $path HTTP/1.1\r\nHost: $host\r\n\r\ ...

  2. socket读写返回值的处理

    在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...

  3. Socket聊天程序——Common

    写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...

  4. Socket聊天程序——客户端

    写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...

  5. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  6. Socket聊天程序——初始设计

    写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...

  7. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  8. Android Socket连接PC出错问题及解决

    最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.

  9. Linux下的C Socket编程 -- server端的继续研究

    Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...

随机推荐

  1. PHP中普通方法和静态方法

    普通方法(实例方法) 一个类中定义的方法,可以为这个类的所有对象调用的方法.也可以理解为,这个类的所有对象,都各自有自己的一个该方法: 定义形式: class  类名{ function  方法名(形 ...

  2. SQL中INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN区别

    sql中的连接查询有inner join(内连接).left join(左连接).right join(右连接).full join(全连接)四种方式,它们之间其实并没有太大区别,仅仅是查询出来的结果 ...

  3. C++解析(27):数组、智能指针与单例类模板

    0.目录 1.数组类模板 1.1 类模板高效率求和 1.2 数组类模板 1.3 堆数组类模板 2.智能指针类模板 2.1 使用智能指针 2.2 智能指针类模板 3.单例类模板 3.1 实现单例模式 3 ...

  4. Spring Boot系列教程四:配置文件详解properties

    一.配置随机数,使用随机数 在application.properties文件添加配置信息 #32位随机数 woniu.secret=${random.value} #随机整数 woniu.numbe ...

  5. python之选择排序

    选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个 ...

  6. ZOJ3899 State Reversing 【线段树 + NTT】

    题目链接 ZOJ3899 题解 比较累,做一道水题 还被卡常= = 我在\(ZOJ\)交过的两道\(NTT\)都被卡常了.. 哦,题意就是求第二类斯特林数,然后线段树维护一下集合数量就可以了 #inc ...

  7. 【bzoj4559】成绩比较

    Portal -->bzoj4559 补档计划 ​  借这题补个档--拉格朗日插值 ​​  插值的话大概就是有一个\(n-1\)次多项式\(A(x)\),你只知道它在\(n\)处的点值,分别是\ ...

  8. php整理

    linux上安装php配套环境有些繁琐 推荐使用一键安装: https://lnmp.org/install.html phalcon框架环境: centos7下php7.0.x安装phalcon框架

  9. 协程-遇到I/O自动切换

    参考博客:http://www.cnblogs.com/alex3714/articles/5248247.html 一.前言 Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步 ...

  10. TCP协议基础知识及wireshark抓包分析实战

    TCP相关知识 应swoole长连接开发调研相关TCP知识并记录. 数据封包流程 如图,如果我需要发送一条数据给用户,实际的大小肯定是大于你发送的大小,在各个数据层都进行了数据的封包,以便你的数据能完 ...