2014-03-29 51 views
1

我是Perl套接字編程的初學者。到目前爲止,服務器發送一個字符串,客戶端在我的程序中響應另一個字符串。稍後,如果服務器發送另一個字符串,則客戶端無法接收它。爲了多次在服務器和客戶端之間傳輸數據,我是否應該包含任何功能?perl套接字的工作

SERVER:

#!/usr/bin/perl 
use strict; 
use warnings; 
use IO::Socket::INET; 

my $socket; 
my $clientsocket; 
my $serverdata; 
my $clientdata; 

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

print "Waiting for the Client.\n"; 
$clientsocket = $socket->accept(); 
print "Connected from : ", $clientsocket->peerhost(); 
print ", Port : ", $clientsocket->peerport(), "\n"; 

# Write some data to the client 
$serverdata = "This is the Server speaking \n"; 
print $clientsocket "$serverdata \n"; 

# read the data from the client 
$clientdata = <$clientsocket>; 
print "$clientdata"; 
$serverdata = "Server Again writing \n"; 
print $clientsocket "$serverdata"; 

$socket->close(); 

客戶:

#!/usr/bin/perl 
use strict; 
use warnings; 
use IO::Socket::INET; 
use Tk; 

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

print "Connected to the Server.\n"; 

# read the message sent by server. 
$serverdata = <$socket>; 
print "Message from Server : $serverdata \n"; 

# Send some message to server. 
my $name = "Client here!"; 
print $socket "$name"; 

# Read message sent by server. 
$serverdata = <$socket>; 
print "$serverdata"; 

$socket->close(); 

在客戶端$ serverdata第二次印刷時不會發生。

+1

您的問題未包含足夠的信息以提供任何明智的答案 –

+0

請向我們展示您的服務器和客戶端到目前爲止。 – 2014-03-29 13:57:51

回答

0

您的服務器開始在某個端口上偵聽。它等待客戶端連接,即連接。它通過客戶端連接讀取和寫入一些數據。接着?然後它關閉套接字並退出程序。

這不是你想要的:你希望服務器開始等待下一個連接。這意味着,一些類型的循環:每個客戶端連接的時候,我們會盡我們的溝通:

while (my $client = $socket->accept) { 
    # do something with the $client 
} 

我建議你通過perldoc perlipc的相關章節讀,但請記住,它使用了過時的最佳實踐,所以不要不要直接複製任何東西。

+0

如果服務器要關閉套接字並退出,那麼服務器可以讀取客戶機到服務器的第二條消息怎麼可能?我修改了上面的代碼,以便客戶端在它關閉之前發送第二條消息。而且,服務器似乎沒有任何麻煩地收到它。我還沒有使用while循環呢! – Raji

+0

@ user2691811非常簡單:在下一個客戶端到達之前不要關閉套接字。中心點在於'accept'應該在*循環*中發生,而不僅僅是*一次*。 – amon

+0

我想,我的問題是服務器發送多條消息。客戶端能夠發送多條消息。我沒有想到服務器關閉它的套接字。如果是這樣的話,它如何能夠從客戶端接收數據? – Raji

1

只要確保您的客戶端發送一整行。如果您正在閱讀

<$clientsocket> 

您的服務器等待客戶端的「\ n」。

2

如果您使用從另一端讀取郵件,發件人必須以「\ n」結尾郵件。 或者,您可以使用recv(...),以便消息不會被緩存到換行符。