#!/usr/bin/perl

use warnings;
use strict;

use POE qw( Component::Server::TCP );
# Gleichbedeutend mit:
#  use POE;
#  use POE::Component::Server::TCP;
# Das ist also nur als Abkürzung.

# Nun benutzen wir PoCo::Server::TCP, um einen einfachen Echo-Server
# aufzubauen.
POE::Component::Server::TCP->new(
  # Unser Server soll auf TCP-Port 1234 lauschen.
  Port => 1234,

  # Immer, wenn irgendein Client was zu uns sendet (zeilen-basiert), dann wird
  # die Sub handle_input aufgerufen.
  ClientInput => \&handle_input
);

# So, das alles nützt aber nichts, wenn wir den POE::Kernel nicht starten.
# Der POE::Kernel sorgt dafür, dass die einzelnen Sessions sich mit Events
# untereinander unterhalten können, etc.
POE::Kernel->run;

# Wenn der Kernel fertig ist, können wir uns beenden.
# Das exit hier wäre überflüssig, da ja jetzt nur noch ne Sub kommt, aber zur
# Klarheit macht man es oft hin.
exit;

# So, das ist die Sub, die aufgerufen wird, wenn der Server vom Clienten was
# kriegt.
sub handle_input {
  # in $_[ARG0] ist die Zeile, die gesendet wurde, ohne \r, \n, etc.
  my ($heap, $zeile) = @_[HEAP, ARG0];

  # $heap ist ne Referenz auf nen Hash.
  # Wir zählen mit, wie viele Zeilen uns der Client insgesamt schon geschickt
  # hat.
  $heap->{zeilen}++;

  # Nun schicken wir dem Client das zurück.
  # $heap->{client} wurde von POE::Component::Server::TCP für uns gesetzt.
  # Das ist ein sogenanntes Wheel, was die Verbindung zum Client darstellt.
  # Über die Methode put können wir dem Client was schicken.
  # put erwartet beliebig viele Zeilen als Argumente (ohne \r\n).
  # Das Wheel macht dann \r\n dran und sendet sie übers Netz.
  $heap->{client}->put("Das war deine $heap->{zeilen}. Zeile: \"$zeile\"");
}
