====== 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.