Tôi đang cố gắng viết một ứng dụng trò chuyện mạng cơ bản trong Perl cho mục đích học tập. Tôi hiện đang có một chương trình máy chủ và máy khách hoạt động gần như tôi muốn. Nhiều khách hàng có thể kết nối với máy chủ và gửi tin nhắn đến và từ đó. Tuy nhiên, tôi không thực sự chắc chắn làm thế nào để đi về gửi tin nhắn từ một khách hàng khác và sẽ đánh giá cao một đẩy đúng hướng ở đây. Đây là mã tôi có cho đến nay, suy nghĩ?Ứng dụng trò chuyện mạng cơ bản trong Perl
Lưu ý: Đây là lần đầu tiên tôi thử sử dụng mạng hoặc sử dụng Perl cho một dự án phù hợp để mọi hướng dẫn khác về cách viết cũng sẽ được đánh giá cao.
chat_server.pl
#!/usr/bin/perl -w
# chat_server.pl
use strict;
use IO::Socket::INET;
my $port = shift or die "Port required!\n";
my $socket = IO::Socket::INET->new(
LocalPort => $port,
Proto => 'tcp',
Listen => SOMAXCONN
) or die "Can't create socket: $!!\n";
my $child;
print "Listening for clients on $port...\n";
REQUEST:
while(my $client = $socket->accept) {
my $addr = gethostbyaddr($client->peeraddr, AF_INET);
my $port = $client->peerport;
if($child = fork) {
print "New connection from $addr:$port\n";
close $client;
next REQUEST;
} die "fork failed!\n" unless defined $child;
while (<$client>) {
print "[$addr:$port] says: $_";
print $client "[$addr:$port] says: $_";
}
}
close $socket;
chat_client.pl
#!/usr/bin/perl -w
# chat_client.pl
use strict;
use IO::Socket::INET;
my $port = shift or die "No port\n";
my $server = shift or die "No server\n";
my $client_socket = IO::Socket::INET->new(
PeerPort => $port,
PeerAddr => $server,
Proto => 'tcp'
) or die "Can't create send socket: $!!\n";
my $child;
if($child = fork) {
while(1) {
sleep(1);
print scalar <$client_socket>;
}
}
die "fork failed!\n" unless defined $child;
print "Connected to $server:$port!\n";
do {
print "> ";
print $client_socket $_ if defined $_;
} while(<STDIN>);
print "Closing connection";
close $client_socket;
Điều đó thực sự khá tốt đối với cấp độ kinh nghiệm của bạn.Điều duy nhất tôi sẽ nói ngay lập tức là bạn nên đảm bảo tài liệu học tập của bạn được cập nhật. '-w' trên dòng lệnh hoặc dòng shebang từ lâu đã bị thay thế bởi" cảnh báo sử dụng "vượt trội. Bạn cũng nên khai báo '$ child' trong mã máy chủ bên trong' while', ngay trước 'if' – Borodin