2014-01-07 2 views
3

Perl에 채팅 서버를 쓰고 있는데 호스트 (서버)와 클라이언트간에 메시지를 전송할 수 있지만 동시에 데이터를 보내고받을 수는 없습니다.동시 데이터 전송 Perl 채팅 서버에서?

그렇다면 데이터를 동시에 보내고받을 수 있고 그 중 하나가 계속 진행될 때까지 기다리지 않도록 서버를 구현하려면 어떻게해야합니까?

이것은 지금까지 작성한 내용입니다.

서버

use IO::Socket::INET; 
use Socket; 
# auto-flush on socket 
$| = 1; 
$data; 

my $socket = new IO::Socket::INET (
LocalHost => 'localhost', 
LocalPort => '4200', 
Proto => 'tcp', 
Listen => 5, 
Reuse => 1 
);                 
die "cannot create socket $!\n" unless $socket; 

print "server waiting for client connection on port 4200\n"; 

while(true) 
{ 

my $client_socket = $socket->accept(); 
my $client_address = $client_socket->peerhost(); 
my $client_name=gethostbyaddr($client_address, AF_INET); 
my $client_port = $client_socket->peerport(); 
print "Connection recieved from $client_address\n"; 
while($client_socket != null) 
{ 
    $client_socket->recv($data, 1024); 
     print "$client_name: $data\n"; 
    $msg=<>; 
    $client_socket->send($msg); 
    } 
} 
$socket->close(); 

클라이언트

use IO::Socket::INET; 
$| = 1;            # auto-flush on socket 
my $socket = new IO::Socket::INET (
PeerHost => '127.0.0.1', 
PeerPort => '4200', 
Proto => 'tcp', 
);             # create a connecting socket 
die "cannot connect to the server $!\n" unless $socket; 
print "connected to the server\n"; 

my $recieved; 
while(true) 
{  
     $input=<>; 
    $socket->send($input); 
    $socket->recv($msg,1024); 
    print ">".$msg; 
} 
$socket->close(); 

답변

3

두 프로그램 (스크립트) 단일 스레드 코드입니다. 전이중 (full-duplex) 기능을 원한다면 적어도 프로그램 당 두 개의 스레드가 필요합니다. 하나는 데이터 수신 용이고 다른 하나는 전송 용입니다.

일반적으로 세 개의 스레드가 사용됩니다보기, 전송 및

첫 번째는 수신 큐의 데이터를 표시하고 뭔가

보내기 연결 전송해야 할 때 송신 큐에 보내거나 연결을 유지 수신 원격 서버에 보내고 데이터를 보내면 보내지는 데이터에 대한 확인 만 필요합니다. 적극적으로 수신하지 않음

수신은 원격 서버에 대한 연결을 유지하거나 연결을 유지하고 거기에서 대기중인 데이터를받습니다. 아무 것도 보내지 않고 데이터가있는 동안 루프를 실행하고 수신하고 "플래그"를 기다립니다 보류중인 데이터가있을 때 보내는 서버.

2

스레딩 대신 이벤트 프레임 워크를 사용할 수 있습니다. 예를 들어 POE::Component::Server::IRC은 POE 프레임 워크를 기반으로하는 IRC 서버입니다.

관련 문제