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与类有关的几个魔术方法

    与类有关的其他魔术方法 序列化与反序列化技术 含义: 序列化: 就是将一个变量所代表的“内存”数据,转换为“字符串”形式并持久保存在硬盘上的一种做法. 反序列化: 就是将序列化之后保存在硬盘上的“字符 ...

  2. 第124天:移动web端-Bootstrap轮播图插件使用

    Bootstrap JS插件使用 > 对于Bootstrap的JS插件,我们只需要将文档实例中的代码粘到我们自己的代码中> 然后作出相应的样式调整 Bootstrap中轮播图插件叫作Car ...

  3. dom变成jquery对象 先获取dom对象 然后通过$()转换成jquery对象

    dom变成jquery对象   先获取dom对象 然后通过$()转换成jquery对象

  4. bzoj2301-Problem b

    题意 \(T\le 5\times 10^4\) 次询问,每次询问 \(a,b,c,d,k\le 5\times 10^4\),求 \[ \sum _{i=a}^b\sum _{j=c}^d[gcd( ...

  5. C++解析(5):内联函数分析

    0.目录 1.常量与宏回顾 2.内联函数 3.内联函数深度探析 4.注意事项 5.小结 1.常量与宏回顾 C++中的const常量可以替代宏常数定义,如: const int A = 3; <- ...

  6. C++11Mutex(互斥锁)详解

    多个线程访问同一资源时,为了保证数据的一致性,最简单的方式就是使用 mutex(互斥锁). (1).直接操作 mutex,即直接调用 mutex 的 lock / unlock 函数.此例顺带使用了 ...

  7. 【BZOJ4443】小凸玩矩阵(二分答案,二分图匹配)

    [BZOJ4443]小凸玩矩阵(二分答案,二分图匹配) 题面 BZOJ Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两 ...

  8. c++ 智能指针(转)

    智能指针的使用 智能指针是在 <memory> 标头文件中的 std 命名空间中定义的. 它们对 RAII 或“获取资源即初始化”编程惯用法至关重要. 此习惯用法的主要目的是确保资源获取与 ...

  9. C++类间转换之dynamic_cast

    当在C++的基类与派生类之间转换时,其多态性充分显现出来: 本次只讨论  dynamic_cast  的用法. 在查阅资料后发现百度百科关于  dynamic_cast  (以及static_cast ...

  10. Codeforces 894.C Marco and GCD Sequence

    C. Marco and GCD Sequence time limit per test 1 second memory limit per test 256 megabytes input sta ...