Perl $\输出额外的数据位

Perl $\输出额外的数据位,perl,network-programming,client-server,Perl,Network Programming,Client Server,静态$可能需要刷新。它试图由$|=1;完成 所需输出: 客户 服务器 代码: 客户端 use strict; use warnings; use IO::Socket::INET; my $socket = new IO::Socket::INET (PeerHost => '127.0.0.1', PeerPort => '1055', Proto => 'tcp', Reuse => 1) or die "$!\n"; print "Connecte

静态$可能需要刷新。它试图由$|=1;完成

所需输出:

客户

服务器

代码:

客户端

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

my $socket = new IO::Socket::INET (PeerHost => '127.0.0.1', PeerPort => '1055', Proto    => 'tcp', Reuse    => 1) or die "$!\n";

print "Connected to the Server.\n";

send_login();
$|=1;
receive_loginack();
$socket->close();

sub send_login
{
    my $login_txt = "Login.txt";
    open LOGIN, '<', $login_txt or die "Cannot open $login_txt $!\n";
    my @login = <LOGIN>;
    close LOGIN;

    my $logfile = "logfile.txt";
    open LOG, '>>', $logfile or die "Cannot open $logfile ($!)\n";

    foreach my $login (@login)
    {
        print $socket $login;
        print LOG "CLIENT : $login";
        print "sent to server : $login";
        #last if ($login eq "\$END\$\n");

    }
    close LOG;
}

sub receive_loginack
{
    while (<$socket>)
    {   
        print"Message received from Server : $_";
    }
}
使用严格;
使用警告;
使用IO::Socket::INET;
my$socket=新IO::socket::INET(PeerHost=>127.0.0.1',PeerPort=>1055',Proto=>tcp',Reuse=>1)或死“$!\n”;
打印“已连接到服务器。\n”;
发送_登录();
$|=1;
接收_loginack();
$socket->close();
子发送单元登录
{
我的$login_txt=“login.txt”;
打开登录名“>”、$logfile或die“无法打开$logfile($!)\n”;
foreach my$login(@login)
{
打印$socket$login;
打印日志“客户端:$login”;
打印“发送到服务器:$login”;
#最后一个if($login eq“\$END\$\n”);
}
闭合日志;
}
子接收逻辑
{
而()
{   
打印“从服务器接收到的消息:$\”;
}
}
服务器

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

my $socket = new IO::Socket::INET (LocalHost => '127.0.0.1', LocalPort => '1055', Proto => 'tcp', Listen => 1, Reuse => 1) or die "Oops: $! \n";

print "Waiting for the Client.\n";
server_loop();
$socket->close();

sub server_loop
{
OUTER:
    while (my $clientsocket = $socket->accept())
    {
        print "connected from : ", $clientsocket->peerhost();
        print ", port : ", $clientsocket->peerport(), "\n";

INNER:
        while (<$clientsocket>)                                 #
        {                                                       #
            print"Message received from Client : $_";           #
            last INNER if ($_ eq "\$END\$\n");                  #       RECEIVING
            #last OUTER if ($_ eq "\$QUIT\$\n");                #
            print $clientsocket $_;                             #
        }                                                       #

        my $login_ack = "login_ack.txt";
        open LOGINACK, '<', $login_ack or die "Cannot open login acknowledgment file $login_ack ($!)\n";
        my @loginack = <LOGINACK>;
        close LOGINACK;

        my $logfile = "logfile.txt";
        open LOG, ">>", $logfile or die "cannot open $logfile ($!)\n";

        foreach my $loginack (@loginack)
        {
            $|=1;
            print $clientsocket $loginack;
            print LOG "SERVER : $loginack";
            print "server to client : $loginack";
            #last if ($loginack eq "\$END\$\n");
        }

        close LOG;
        close $clientsocket;
    }
}
使用严格;
使用警告;
使用IO::Socket::INET;
我的$socket=new IO::socket::INET(LocalHost=>'127.0.0.1',LocalPort=>'1055',Proto=>'tcp',Listen=>1,Reuse=>1)或die“Oops:$!\n”;
打印“正在等待客户端。\n”;
服务器_循环();
$socket->close();
子服务器循环
{
外部:
while(my$clientsocket=$socket->accept())
{
打印“连接自:”,$clientsocket->peerhost();
打印“,端口:”,$clientsocket->peerport(),“\n”;
内部:
而()#
{                                                       #
打印“从客户端接收到的消息:$\”#
最后一个内部if($\ueq“\$END\$\n”);#接收
#最后一个外部if($\ueq“\$QUIT\$\n”)#
打印$clientsocket$\u#
}                                                       #
my$login\u ack=“login\u ack.txt”;

打开LOGINACK,“服务器的输入循环包含:

print $clientsocket $_;

因此,客户端发送到服务器的所有内容都将在登录确认文件之前发送回客户端。因此,客户端将其打印为从服务器接收到的消息。

服务器的输入循环包含:

print $clientsocket $_;

因此,客户端发送到服务器的所有内容都将在登录\u ack.txt文件之前发送回客户端。因此,客户端将其打印为从服务器收到的消息。

感谢您调查此事。当我在服务器(foreach循环)中注释发送部分时,来到ans,客户端仍然打印该特定部分。我的看法是,它是从客户端本身接收的。不,没有任何东西会自动导致客户端读取它发送的内容。刷新与此无关,流的两个方向是独立的。哦。那么该如何处理这种情况?再次检查你真的删除了
print
语句。你确定在删除该语句时重新启动了服务器吗?我只是不相信删除该语句后仍然存在问题,这显然是原因。感谢你调查此事。来到ans,当我在服务器(foreach循环)中注释掉发送部分时,客户端仍然打印该特定部分。我的看法是,它是从客户端本身接收的。不,没有任何东西会自动导致客户端读取它发送的内容。刷新与此无关,流的两个方向是独立的。哦。那么该如何处理这种情况?再次检查因为您确实删除了
print
语句。您确定在执行此操作时重新启动了服务器吗?我只是不相信您仍然存在删除该语句的问题,这显然是原因。
print $clientsocket $_;