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应该是能够一直 ...
随机推荐
- mysql导出/导入表结构以及表数据
导出: 命令行下具体用法如下: mysqldump -u用戶名 -p密码 -d 数据库名 表名 脚本名; 1.导出数据库为dbname的表结构(其中用戶名为root,密码为dbpasswd,生成的脚 ...
- 【数据库】SQL两表之间:根据一个表的字段更新另一个表的字段
1. 写法轻松,更新效率高:update table1 set field1=table2.field1,field2=table2.field2from table2where table1.id= ...
- 【bzoj1495】[NOI2006]网络收费 暴力+树形背包dp
题目描述 给出一个有 $2^n$ 个叶子节点的完全二叉树.每个叶子节点可以选择黑白两种颜色. 对于每个非叶子节点左子树中的叶子节点 $i$ 和右子树中的叶子节点 $j$ :如果 $i$ 和 $j$ 的 ...
- mysql索引长度的一些限制
一.myisam存储引擎 1. 数据库版本:阿里云RDS MySQL5.1 mysql> select @@version;+-------------------------------+| ...
- [BZOJ2432][Noi2011]兔农 矩阵乘法+exgcd
2432: [Noi2011]兔农 Time Limit: 10 Sec Memory Limit: 256 MB Description 农夫栋栋近年收入不景气,正在他发愁如何能多赚点钱时,他听到 ...
- Wifi密码破解实战
原文链接地址:http://www.freebuf.com/articles/wireless/127261.html https://www.baidu.com/?tn=98012088_4_dg& ...
- 洛谷P4609 [FJOI2016]建筑师 【第一类斯特林数】
题目链接 洛谷P4609 题解 感性理解一下: 一神带\(n\)坑 所以我们只需将除了\(n\)外的\(n - 1\)个元素分成\(A + B - 2\)个集合,每个集合选出最大的在一端,剩余进行排列 ...
- 开放接口/RESTful/Api服务的设计和安全方案
总体思路 这个涉及到两个方面问题:一个是接口访问认证问题,主要解决谁可以使用接口(用户登录验证.来路验证)一个是数据数据传输安全,主要解决接口数据被监听(HTTPS安全传输.敏感内容加密.数字签名) ...
- Caffe框架详细梳理
protobuf是google公司开发的,并在Google内部久经考验的一个东西,在08年google把它贡献给了开源社区,随后便有越来越多的人使用它.protobuf是一个结构化信息传递的工具,主要 ...
- Ubuntu 使用Compiz配置炫酷3D桌面
先看一下效果 要实现这种3D 的效果其实很简单. Step 1:安装N卡驱动工具 sudo apt- 这个东西其实没有太大的作用. Step 2:安装Compiz sudo apt-get insta ...