perl6 Socket
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的更多相关文章
- perl6 Socket: 发送HTTP请求
sub MAIN(Str $host,Str $path, Int $port) { my $send = "GET $path HTTP/1.1\r\nHost: $host\r\n\r\ ...
- socket读写返回值的处理
在调用socket读写函数read(),write()时,都会有返回值.如果没有正确处理返回值,就可能引入一些问题 总结了以下几点 1当read()或者write()函数返回值大于0时,表示实际从缓冲 ...
- Socket聊天程序——Common
写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...
- Socket聊天程序——客户端
写在前面: 上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业前考的软考证书,然后接下来就是在加班的日子度过了,今天正好周五,打算把客户端的详细 ...
- Socket聊天程序——服务端
写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...
- Socket聊天程序——初始设计
写在前面: 可能是临近期末了,各种课程设计接踵而来,最近在csdn上看到2个一样问答(问题A,问题B),那就是编写一个基于socket的聊天程序,正好最近刚用socket做了一些事,出于兴趣,自己抽了 ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- Android Socket连接PC出错问题及解决
最近测试问题:Android 通过Socket链接电脑,ip和端口都是正确的,也在同一网段,可android端就是报异常如下: 解决办法:测试电脑的防火墙可能开着,在控制面板把防火墙打开即可.
- Linux下的C Socket编程 -- server端的继续研究
Linux下的C Socket编程(四) 延长server的生命周期 在前面的一个个例子中,server在处理完一个连接后便会立即结束掉自己,然而这种server并不科学啊,server应该是能够一直 ...
随机推荐
- PHP中普通方法和静态方法
普通方法(实例方法) 一个类中定义的方法,可以为这个类的所有对象调用的方法.也可以理解为,这个类的所有对象,都各自有自己的一个该方法: 定义形式: class 类名{ function 方法名(形 ...
- SQL中INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN区别
sql中的连接查询有inner join(内连接).left join(左连接).right join(右连接).full join(全连接)四种方式,它们之间其实并没有太大区别,仅仅是查询出来的结果 ...
- C++解析(27):数组、智能指针与单例类模板
0.目录 1.数组类模板 1.1 类模板高效率求和 1.2 数组类模板 1.3 堆数组类模板 2.智能指针类模板 2.1 使用智能指针 2.2 智能指针类模板 3.单例类模板 3.1 实现单例模式 3 ...
- Spring Boot系列教程四:配置文件详解properties
一.配置随机数,使用随机数 在application.properties文件添加配置信息 #32位随机数 woniu.secret=${random.value} #随机整数 woniu.numbe ...
- python之选择排序
选择排序:比如在一个长度为N的无序数组中,在第一趟遍历N个数据,找出其中最小的数值与第一个元素交换,第二趟遍历剩下的N-1个数据,找出其中最小的数值与第二个元素交换......第N-1趟遍历剩下的2个 ...
- ZOJ3899 State Reversing 【线段树 + NTT】
题目链接 ZOJ3899 题解 比较累,做一道水题 还被卡常= = 我在\(ZOJ\)交过的两道\(NTT\)都被卡常了.. 哦,题意就是求第二类斯特林数,然后线段树维护一下集合数量就可以了 #inc ...
- 【bzoj4559】成绩比较
Portal -->bzoj4559 补档计划 借这题补个档--拉格朗日插值 插值的话大概就是有一个\(n-1\)次多项式\(A(x)\),你只知道它在\(n\)处的点值,分别是\ ...
- php整理
linux上安装php配套环境有些繁琐 推荐使用一键安装: https://lnmp.org/install.html phalcon框架环境: centos7下php7.0.x安装phalcon框架
- 协程-遇到I/O自动切换
参考博客:http://www.cnblogs.com/alex3714/articles/5248247.html 一.前言 Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步 ...
- TCP协议基础知识及wireshark抓包分析实战
TCP相关知识 应swoole长连接开发调研相关TCP知识并记录. 数据封包流程 如图,如果我需要发送一条数据给用户,实际的大小肯定是大于你发送的大小,在各个数据层都进行了数据的封包,以便你的数据能完 ...