Leser: 23
Guest timalso der server funktioniert ja und ich kann mich ja auch per telnet verbinden aber ich möchte ja einen client schreiben. doch wie stelle ich es an dass ich eingaben machen kann und gleichzeitig auch etwas empfangen kann?
2009-09-16T13:28:10 pqIO::Select ist doch im verlinkten wiki-beispiel drin. das ermöglicht nichtblockierendes lesen.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
my $sock = IO::Socket::INET->new("loclahost:1111");
while() {
my $server = <$sock>;
chomp($sock);
if($sock =~ 'm(.*?)) {
my $msg = $2;
print "$msg\n";
}
}
### So empfage ich nachrichten vom server und sie werden mir angezeigt
### doch das senden verstehe ich noch nicht.
### mit senden:
my $sock = IO::Socket::INET->new("loclahost:1111");
while() {
my $server = <$sock>;
chomp($sock);
if($sock =~ 'm(.*?)) {
my $msg = $2;
print "$msg\n";
}
my $text = <STDIN>;
if($text =~ 'say (.*)') {
my $msg_send = $1;
print $sock "m($msg_send)\n";
}
}
1 2 3
my $select = IO::Select->new($client, \*STDIN); # schleife wie im bsp. und dann überprüfen ob $socket == \*STDIN # und ergebnis von readline halt dann an den server senden
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
my $sock = IO::Socket::INET->new("loclahost:1111"); my $text=''; while() { my $server=''; eval{ local $SIG{ALRM}=sub{die;}; alarm(1); $server = <$sock>; alarm(0); }; chomp($server); if($server =~ 'm(.*?)) { my $msg = $2; print "$msg\n"; } eval{ local $SIG{ALRM}=sub{die;}; local $/=undef; alarm(1); my $txt; while(read(STDIN,$txt,1)) { last if($txt=~/[\r\n]/); alarm(1); $text .= $txt; } alarm(0); }; if($text =~ 'say (.*)') { my $msg_send = $1; print $sock "m($msg_send)\n"; $text=''; } }
Guest werDu musst mit "treads" oder mit "alarm" oder mit nicht-blockierenden (nonblocking) Handles arbeiten.
Jedes hat sein vor und Nachteile.
QuoteThreads hingegen wären auch eine vernünftige Alternative, in Perl ist es aber meist nicht so toll, mit Threads zu arbeiten.
2009-09-16T15:47:15 sid burnQuoteThreads hingegen wären auch eine vernünftige Alternative, in Perl ist es aber meist nicht so toll, mit Threads zu arbeiten.
Zumindest nicht mit den eingebauten "ithreads". Coro klingt aber ziemlich nett und wollte ich wenn ich irgendwann mal dazu komme nochmal ausprobieren.
2009-09-16T15:57:17 betterworld2009-09-16T15:47:15 sid burnQuoteThreads hingegen wären auch eine vernünftige Alternative, in Perl ist es aber meist nicht so toll, mit Threads zu arbeiten.
Zumindest nicht mit den eingebauten "ithreads". Coro klingt aber ziemlich nett und wollte ich wenn ich irgendwann mal dazu komme nochmal ausprobieren.
Hilft Coro hier? Wenn ich das richtig verstanden habe, bietet es cooperative multi-tasking, und nicht etwa die Moeglichkeit, zwei read()-Calls gleichzeitig auszufuehren, und das ist ja das, was hier gebraucht wird.
QuoteEdit: Jedenfalls ist es das, was ich mit Threads oben meinte. Vermutlich kann man ueber Event-Systeme damit dann auch das Lesen von zwei Dateihandles realisieren, aber das läuft dann wahrscheinlich auch nur wieder ueber select() oder poll() etc.