Thread WebSocket Server tut nicht (3 answers)
Opened by Xorg1990 at 2013-08-04 11:58

topeg
 2013-08-05 16:13
#169371 #169371
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Wie CPAN:Net::WebSocket::Server funktioniert:

Nachdem der Server gestartet ist wartet er auf eine Verbindung, wird diese hergestellt startet der Server einen Subprozess er auf Nachrichten von diesem Socket wartet.

Kommt eine Nachricht, werden die vorher angebenden Handler gestartet. Handler bedeutet hier so viel wie "Code der Aktionen handhabt".
Handler werden auch Hooks genannte weil sie sich an bestimmten Stellen in den Code "hängen". Oder auch Code-Calls Weil sie dem Modul fremden Code aufrufen.

"Event-Handler" sind sind hier Codeabschnitte, die bei bestimmten Aktionen aufgerufen werden wie während einer Websocket-Sitzung auftreten können.

Handler sind Subroutienen in denen du Schreibst was an bestimmten Stellen im Programmablauf des Servers passieren soll. Die Stellen definieren gewisse Aktionen.

Eine Aktion ist z.B der Verbindungsaufbau oder der Abbau einer Verbindung. Für dich interessant sind die Aktionen, die beim Empfang einer Nachricht und beim Verbindungsaufbau ausgeführt werden.

Einer dieser Handler ist on_connect. Der darin enthaltene Programmcode wird ausgeführt wenn sich ein Client mit dem Server verbindet.

Bei dir wird dann code ausgeführt der für diese Verbindung Handler erzeugt. Du setzt den Handler binary dieser wird immer dann aufgerufen wenn eine Nachricht auf diesem Websocket an den Server gesendet wird. Die Nachricht wird nicht weiter verarbeitet und formatiert sondern so wie sie kommt an den Handler übergeben.

Alles was du machen musst ist die Nachricht anzunehmen und zu verarbeiten.
Es werden keinerlei Schleifen gebraucht. Das macht alles der Server für dich.

Das Konzept eines Handlers ist zuerst ungewohnt, wenn man normalerweise prozedural Programmiert und sich nie über Funktionsreferenzen Gedanken gemacht hat. Es erlaubt aber eine sehr elegante und einfache Programmierung, wenn man das Konzept verstanden hat.

Ein Problem ist, das einem der "Main-Loop" aus der Hand genommen wird. Als "Main-Loop" bezeichnet man die Schleife, die Den ganzen Programmcode umfasst. In diesem wird auf Eingaben reagiert, Reaktionen auf Aktionen ausgelöst usw. In machen fällen ist es wichtig selber Aktionen in den Main-Loop zu setzen, um z.b regelmäßige Aktionen ausführen zu können. Dieses Modul bietet keine Möglichkeit Code in den Main-loop zu setzen.
Aus dem Grund wurde "Threads" angesprochen. Threads erlauben "neben läufige" Programmierung. Damit ist gemeint, dass man mehrere Programmteile Nebeneinander Ausführen kann, die möglichst zu selben Zeit ausgeführt werden. Man kann es sich so vorstellen, das man mehrere Programme hat die auf einfache weise Miteinander kommunizieren können. Dabei gibt es aber durchaus ein paar Sachen zu beachten, aber ich gehe erst darauf ein wenn es nötig sein sollte.

Für dich reicht es erst mal zu wissen das dieser Code funktioniert:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl
use strict;
use warnings;
use Net::WebSocket::Server;

Net::WebSocket::Server->new(
      listen => 5000,
      silence_max => 0,
        on_connect => sub {
            my ($serv, $conn) = @_;
            $conn->on(
                binary => sub {
                  my ( $conn, $message ) = @_;
                  $conn->send_binary($message);
                },
            );
        },
)->start;

View full thread WebSocket Server tut nicht