Socket / Netzwerkprogrammierung

Python ist gut für Netzwerkprogramme geeignet, da es recht schnell zu Ergebnissen führt. Um die hier beschriebene Funktionalität nutzen zu können benötigen Sie import socket in Ihrem Programm. Fügen Sie die Zeile oben zu Ihrem Programm hinzu.

Als erstes muss die Datenstruktur des Sockets erstellt werden:

s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM);

Hier wird ein UDP-Socket für das Internet erstellt. AF_INET gibt an, dass es sich um einen Internetsocket handelt, der zweite Paramter kann entweder socket.SOCK_DGRAM (UDP, Datagram) oder socket.SOCK_STREAM (TCP, Bitstream) sein.

Server

Beginnen wir mit dem Server-Programm. Der Server muss sich auf einen Port binden und dann am Socket lauschen ob Daten kommen:

s.bind(("", 6311));
s.listen(1);

bind bindet den Socket an die lokale IP-Adresse („“ → erster Parameter des Tupels) und an den Port 6311 (zweites Element). Wenn bereits ein Programm an dem Port (hier UDP) lauscht, dann werden Sie den Socket nicht an den Port binden können. Verwenden Sie deshalb sicherheitshalber try | except .

Bei TCP muss der Server zusätzlich am Socket lauschen (das machen Sie mit s.listen(1)). Im Beispiel soll der Server einen String zb. „6*3“ am „*“ auftrennen, die beiden Zahlen addieren und zum Clienten zurückschicken. Wenn also also ein Client etwas schickt, wird der Server aktiv:

msg, addr=recvfrom(1024);

Je nach Betriebssystem und Python-Version wartet recvfrom bis 1024 Byte gesendet wurden. Ich gehe hier davon aus, dass das nicht der Fall ist. recvfrom gibt die Nachricht und ein Tupel mit IP-Adresse und Port des Clienten zurück. Nun zur Verarbeitung des Requests (ich gehe hier davon aus, dass die Nachricht immer stimmt, bitte vergewissern Sie sich in echten produktiv-genutzten Projekten, dass Sie immer korrekte Nachrichten verarbeiten und alle anderen wegwerfen, weil sonst evtl. Ihr Programm abstürzen könnte).

sp=msg.split("*");
resultat=int(sp[0]) + int (sp[1]);

Die Funktion split trennt den String msg am „*“ und int wandelt eine Zeichenkette in eine Ganzzahl (Integer) um. Da die Berechnung nun geschafft ist, wird es Zeit dem Clienten sein Ergebnis zurückzusenden:

print "Von: %s:%d --> %d + %d = %d"%(addr[0], add[1], int(sp[0]), int(sp[1]), resultat);
s.sendto(resultat, (addr[0], addr[1]));

Sie bemerken Beim Ausführen des Servers, dass er nur eine Anfrage lang aktiv bleibt und sich danach beendet. Wenn Sie das verhindern wollen, können Sie zB. mit while 1 eine Endlosschleife erzeugen.

Client

Der Client hat den Socket erstellt. Er kann bei UDP sofort lossenden. Zb. folgendermaßen:

s.sendto("6*3", (127.0.0.1, 6311));
 
msg, addr=s.recvfrom(1024);
 
print "Ergebnis: %s", msg;

Der Client sendet die Anfrage (in dem Beispiel an localhost, Port 6311, also an den eigenen Rechner - aber an das Server-Programm, was hoffentlich auf Port 6311 lauscht). Dann wartet der Client auf eine Antwort des Servers und gibt sie aus.

TCP/UDP

Im Beispiel bin ich von einer Übertragung über UDP ausgegangen. UDP ist nicht für alle Anwendungszwecke geeignet, verwenden Sie für Datenverkehr, der definitiv ankommen muss lieber TCP. Die Programmierung erschwert das nur wenig, da Python connect() und accept() als Funktionen des Sockets mit bringt. connect() führt der Client aus, und accept() der Server. Außerdem werden die Funktionen recv und send benutzt, weil durch die Verbindung von TCP klar ist, wohin gesendet werden soll, wenn sie s.send aufrufen.