• perl6 Socket


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

    官方介绍如下:

    #下面是客户端
    multi method new(
    :$host, :$port, :$family = 2, :$encoding = 'utf-8', :$nl-in = " ", --> IO::Socket::INET:D)


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

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

    服务端:

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

    客户端:

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

    完整服务端例子:
    my $s = IO::Socket::INET.new(:listen, :localhost<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<localhost>, :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官方文档如下:

    https://docs.perl6.org/type/Blob

    如果你的 Socket 接收到  Blob 后, 想转化为字符串型式, 可以用如下方法:

    $data.decode('utf-8')

    Socket用完了, 最后就是关闭了:

    method close(IO::Socket:D)

    用法如下:

    $socket.close;
    close($socket);

  • 相关阅读:
    hihocoder1062 最近公共祖先·一
    POJ2342 Anniversary party(动态规划)(树形DP)
    【动态规划】抄近路(水题)
    【动态规划】数的划分 (动态规划)
    【动态规划】矩形嵌套 (DGA上的动态规划)
    hihocoder Popular Products(STL)
    hihocoder Counting Islands II(并查集)
    51nod 编辑距离问题(动态规划)
    51nod 最长公共子序列问题(动态规划)(LCS)(递归)
    目标提取——背景均匀、目标与背景相似
  • 原文地址:https://www.cnblogs.com/perl6/p/7403161.html
Copyright © 2020-2023  润新知