perl - 如何序列化和反序列化发送到套接字的哈希值?

标签 perl sockets serialization hash deserialization

我正在编写两个脚本:客户端和服务器。客户端将其自身连接到服务器,并且必须输入凭据。我想通过哈希将那些凭据发送出去,所以我将它们序列化,将它们发送到服务器套接字,然后在服务器脚本中反序列化哈希。

以下是相关的服务器脚本代码:

$server = IO::Socket::INET->new( Proto => tcp,
    LocalPort => 25,
    Listen => SOMAXCONN,
    Reuse => 1) or die "cannot connect to port $port at localhost";
while (my $new_socket = $serveur->accept())
{
    $new_socket->autoflush(1);
    $line = <$new_socket>;
    my %hashUserInfos = %{thaw($line)};

    my $username = $hashInfosUtilisateur{'username'};
    my $password = $hashInfosUtilisateur{'password'};
}

这是相关的客户端脚本代码:

my $connection = IO::Socket::INET->new(Proto => $protocol,
    PeerAddr => $destination,
    PeerPort => $port) or die "Impossible de se connecter sur le port $port a l'adresse $destination";

print "Nom d'usager:\n";
$username = <STDIN>;
print "Mot de passe:\n";

my $password = <STDIN>;
my $hashedPasword = md5_hex($password);

my %userInfos = ('username' => $username, 'password' => $hashedPassword);
my $serializedInfos = freeze \%userInfos;

print $connection $serializedInfos;

我面临的问题是,当我尝试反序列化哈希值时:
my %hashUserInfos = %{thaw($line)};

我收到错误消息:

Magic number checking on storable string failed



我也尝试使用nfreeze序列化我的哈希,但是在那种情况下,我得到了这个错误,而不是上面的错误:

Can't use an undefined values as a HASH reference



我在这里犯了什么错误?

最佳答案

正如@choroba在评论中所说,您只能读取服务器中的一行,尽管您可以通过读取服务器中的更多行来解决该问题,但您可能希望将换行符用作记录定界符。

通过删除从用户名和密码中读取的换行符,可以使冻结仅使用一行:chomp($username);chomp($password);
您也可以对换行符进行编码,尽管这有点骇人听闻,而且不是很简单的证明。编码:$serializedInfos =~ s/\n/\\n/g;解码:$line =~ s/\\n/\n/g;
或者,您可以更改为仅使用一行的序列化,例如JSON,而不是当前使用的Storage

关于perl - 如何序列化和反序列化发送到套接字的哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33975284/

相关文章:

java - java为什么不用@Serializable注解替换Serializable

Perl:如何使需要脚本中的变量在所需脚本中可用

c++ - recv() 没有获取客户端使用 send() 发送的所有数据

java - PrintWriter 等待 flush()

python - 使用套接字进行以太网通信的最佳实践

jQuery序列化将所有空格转换为加号

Perl File::Find: 先列出目录中的所有文件然后跳转到下一个目录?

真实设备中的 Android strace

perl - 寻找更清晰的鲤鱼::croak()

python - Django 休息 : Uploading and serializing multiple images