init III
This commit is contained in:
119
Perl Nachrichtenticker Chat/server.pl
Normal file
119
Perl Nachrichtenticker Chat/server.pl
Normal file
@@ -0,0 +1,119 @@
|
||||
#!/usr/bin/perl
|
||||
use Thread;
|
||||
use IO::Socket::Multicast;
|
||||
use JSON::XS;
|
||||
|
||||
my @messages :shared;
|
||||
|
||||
if ($ARGV[1] eq "") { wrong_start(); }
|
||||
|
||||
my $MCASTIP :shared;
|
||||
my $MCASTPORT :shared;
|
||||
my $TCPIP :shared;
|
||||
my $TCPPORT :shared;
|
||||
|
||||
($MCASTIP,$MCASTPORT) = split(/:/, $ARGV[0]);
|
||||
($TCPIP,$TCPPORT) = split(/:/, $ARGV[1]);
|
||||
|
||||
if ($MCASTIP eq "" or $MCASTPORT eq "" or $TCPIP eq "" or $TCPPORT eq "") { wrong_start(); }
|
||||
|
||||
open MSG, "<messages";
|
||||
@messages=<MSG>;
|
||||
close MSG;
|
||||
|
||||
foreach (@messages) {
|
||||
chomp;
|
||||
}
|
||||
|
||||
$thr = new Thread \&SendMessage;
|
||||
$thr = new Thread \&ReceiveMessage;
|
||||
|
||||
while(1) { sleep 1; }
|
||||
|
||||
sub SendMessage {
|
||||
# my $ThreadID=Thread->self;
|
||||
|
||||
# multicast socket zum senden von nachrichten öffnen
|
||||
$sock = IO::Socket::Multicast->new(Proto=>'udp',PeerAddr=>"$MCASTIP:$MCASTPORT");
|
||||
$sock->mcast_ttl(8);
|
||||
|
||||
# ein neues json objekt anlegen
|
||||
my $JSONObject = JSON::XS->new->ascii->pretty->allow_nonref();
|
||||
|
||||
# array mit zu sendenden daten
|
||||
my @sendarray;
|
||||
|
||||
# json verpackte daten
|
||||
my $senddata;
|
||||
|
||||
# daten zum senden zusammenbauen
|
||||
while (1) {
|
||||
# zu sendende daten leeren
|
||||
@sendarray=();
|
||||
|
||||
# erstes element enthält start signatur und ip und port des tcp servers für autokonfig
|
||||
push @sendarray, "STARTOFMESSAGES#$TCPIP#$TCPPORT";
|
||||
|
||||
# nachrichten in datei speichern um bei neustart des servers die alten daten zu haben
|
||||
open MSG, ">messages";
|
||||
|
||||
# letzte 20 nachrichten
|
||||
for($i=-20;$i<=-1;$i++) {
|
||||
if (exists $messages[$i]) {
|
||||
# in array anfügen um mitzusenden
|
||||
push @sendarray, "$messages[$i]";
|
||||
# in datei speichern
|
||||
printf MSG "$messages[$i]\n";
|
||||
}
|
||||
}
|
||||
# ende signatur anhängen
|
||||
push @sendarray, "ENDOFMESSAGES";
|
||||
|
||||
# messages datei schließen
|
||||
close MSG;
|
||||
|
||||
# daten aus array zu json objekt kodieren
|
||||
$senddata=$JSONObject->encode(\@sendarray);
|
||||
|
||||
# daten per multicast senden
|
||||
$sock->send("$senddata");
|
||||
|
||||
# eine sekunde warten bis daten erneut gesendet werden
|
||||
sleep (1);
|
||||
}
|
||||
}
|
||||
|
||||
sub ReceiveMessage {
|
||||
$tcpsock=new IO::Socket::INET(LocalHost=>"$TCPIP", LocalPort=> $TCPPORT, Proto=>'tcp', Listen=>5, Reuse=>1);
|
||||
|
||||
while ($tcp_sock=$tcpsock->accept()) {
|
||||
while (defined ($buf=<$tcp_sock>)) {
|
||||
$time = localtime;
|
||||
$buf = sprintf "%s(%24s)",$buf,$time;
|
||||
|
||||
@messages=(@messages, $buf);
|
||||
print "\e[2J";
|
||||
foreach (@messages) {
|
||||
print "$_\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
close ($sock);
|
||||
}
|
||||
|
||||
sub wrong_start {
|
||||
print "\n\nserver MCASTIP:MPort TCPIP:TPort\n\n",
|
||||
" MCASTIP Multicast Adresse an die Nachrichten gesendet werden\n",
|
||||
" Bsp 239.1.1.1\n\n",
|
||||
" MPort Port der für die Multicast Nachrichten verwendet wird\n",
|
||||
" Bsp 64000\n\n",
|
||||
" TCPIP IP Adresse auf die Server hören soll\n",
|
||||
" Bsp 0.0.0.0\n\n",
|
||||
" TPort Port auf den Server hören soll\n",
|
||||
" Bsp 64001\n\n",
|
||||
" Beispielaufruf\n",
|
||||
" server 239.1.1.1:64000 0.0.0.0:64001\n\n",
|
||||
" Falsche IPs und/oder Ports werden nicht! abgefangen\n\n";
|
||||
|
||||
exit;
|
||||
}
|
||||
Reference in New Issue
Block a user