Jemand zu Hause?Leser: 23
SimpleNonBlockingServer geliefert. vielleicht einfach mal ausprobieren, und wenn das läuft, nach deinen vorstellungen erweitern.
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-ProblemGuest 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?
POE an. Da gibt es für viele Sachen schon vorgefertigte Clients, z.B. für IRC gibt es
POE::Component::IRC
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-Problem2009-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
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-Problem1 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=''; } }
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-Problem
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-ProblemGuest werDu musst mit "treads" oder mit "alarm" oder mit nicht-blockierenden (nonblocking) Handles arbeiten.
Jedes hat sein vor und Nachteile.
IPC::System::Simple,
Path::Class
Wie frage ich & perlintro
brian's Leitfaden für jedes Perl-ProblemQuoteThreads 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.
IPC::System::Simple,
Path::Class2009-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.