如何序列化和反序列化发送到套接字的散列?
How to serialize and deserialize a hash sent to a socket?
我正在编写两个脚本:客户端和服务器。客户端将自己连接到服务器并必须输入凭据。我想通过散列发送这些凭据,所以我将它们序列化,将它们发送到服务器套接字,然后在服务器脚本中反序列化散列。
这里是相关的服务器脚本代码:
$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
。
我正在编写两个脚本:客户端和服务器。客户端将自己连接到服务器并必须输入凭据。我想通过散列发送这些凭据,所以我将它们序列化,将它们发送到服务器套接字,然后在服务器脚本中反序列化散列。
这里是相关的服务器脚本代码:
$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
。