Perl:通过套接字打印

时间:2014-04-23 12:19:28

标签: perl sockets

我正在尝试用perl编写战舰,这可以通过网络播放。 问题是我只能在同一台控制台上打印,但不能通过套接字在其他控制台上打印。

客户端:

$socket = new IO::Socket::INET(
    PeerHost => '127.0.0.1',
    PeerPort => '5005',
    Protocol  => 'tcp'
) or die "Socket konnte nicht erstellt werden!\n$!\n";

print "Client kommuniziert auf Port 5005\n";

while ( $eing ne ".\n" ) {
    $eing = <> ;
    print $socket "$eing";
}

服务器:

$socket = new IO::Socket::INET(
    LocalHost => '127.0.0.1',
    LocalPort => '5005',
    Protocol  => 'tcp',
    Listen   => 5,
    Reuse        => 1   
) or die "Socket konnte nicht erstellt werden!\n$!\n";

while ( 1 ) {
    $client_socket = $socket -> accept();
    $peeraddress   = $client_socket -> peerhost();
    $peerport      = $client_socket -> peerport();

    $eing = "";
    while ( $eing ne ".\n" ) {  
        print "while";
        &ausgabe;
    }
}

sub ausgabe {
    foreach $crt_board (@board2) {
        foreach $spalte (@$crt_board) {
            print $client_socket "$spalte ";    
        }
        print $client_socket "\n";
    }
}

结果应该是一块看起来像这样的板子。

   1  2  3  4  5  
1  ?  ?  ?  ?  ?  
2  ?  ?  ?  ?  ?  
3  ?  ?  ?  ?  ?  
4  ?  ?  ?  ?  ?  
5  ?  ?  ?  ?  ?  

1 个答案:

答案 0 :(得分:2)

如果要将数据从服务器传输到客户端,则需要从套接字读取,反之亦然。始终使用严格(和警告)。以下内容将帮助您入门:

客户端:

use strict;
use IO::Socket::INET;

my $socket = new IO::Socket::INET(
    PeerHost => '127.0.0.1',
    PeerPort => '5005',
    Protocol  => 'tcp'
) or die "Socket konnte nicht erstellt werden!\n$!\n";

print "Client kommuniziert auf Port 5005\n";

while ( 1 ) {
    my $data;
    $socket->recv($data, 64);
    print $data;
    last if $data =~ m#\.\n#;
}

服务器:

use strict;
use IO::Socket::INET;

my $socket = new IO::Socket::INET(
    LocalHost => '127.0.0.1',
    LocalPort => '5005',
    Protocol  => 'tcp',
    Listen   => 5,
    Reuse        => 1   
) or die "Socket konnte nicht erstellt werden!\n$!\n";

while ( my $client_socket = $socket -> accept() ) {
    my $peeraddress   = $client_socket -> peerhost();
    my $peerport      = $client_socket -> peerport();

    ausgabe($client_socket);
}

sub ausgabe {
    my $client_socket = shift;
    my @board2 = ([" ", 1,2,3],[1,"?","?","?"],
                  [2,"?","?","?"], [3,"?","?","?"]);
    foreach my $crt_board (@board2) {
        foreach my $spalte (@$crt_board) {
            $client_socket->send("$spalte ");    
        }
        $client_socket->send("\n");
    }
    $client_socket->send(".\n");
}