Seite 1 von 1

Chatprogramm // Fragen zu Funktionen

Verfasst: Mittwoch 15. September 2010, 22:01
von CodeMaster
Guten Tag :)

Ich habe vor einigen Wochen mit dem Informatik unterricht in meiner schule begonnen. Und haben auch gleich mit dem programmieren losgelegt.
Da ich so ziemlich neu im programmieren bin, will ich ein wenig nacharbeiten und vielleicht ein wenig mehr lernen als im Unterricht.

Früher hab ich mal ein wenig mit C++ rumprobiert und in Warcraft 3 hab ich auch schon meine erfahrungen mit coding gemacht, das ist aber nicht normales coding, trifft aber auf die gleiche Struktur zurück.

Naja nun komm ich zu meinen Fragen (:

Mein Lehrer hat uns dann ein paar Blätter ausgedruckt, wo ein Chat Server und ein Chat Client drauf abgebildet ist ausgeteilt.

der Server sieht z.b. so aus:

Code: Alles auswählen

import socket
meinSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     // Was bedeutet AF_INET und SOCK_STREAM?
meinsocket.bind(("", 50000))              //was bedeutet bind?, wieso sind die Anführungsstriche leer? und was ist 50000 ?
meinSocket.listen(1)               // was wird mit listen(1) gemeint?


try:
    while True:
        komm, addr = meinSocket.accept()             // wenn man wörter in einer Zeile schreibt werden gleich mehrere Variablen erzeugt oder was?
        while True:
            data = komm.recv(1024)                      //was ist recv(1024)


            if not data:                             
                komm.close()                     // wieso ist nach komm.close() ein break und nach finally nicht?
                break


            print "[%s] %s" % (addr[0], data)            //print stellt ja irgendetwas dar, aber was kann ich mir nicht erklären und vorallem diese komischen Prozentzeichen nicht
            nachricht = raw_input("Antwort: ")          // Hier wird anscheinend solange darauf gewartet bis man etwas eingibt, bevor es weiter geht oder?
            komm.send(nachricht)         //wird hier die nachricht geschickt? und wenn ja woher weiß ich wohin?
finally:
    meinSocket.close()
Der Client:

Code: Alles auswählen

import socket
ip = raw_input("IP-Adresse: ")
meinSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mein socket.connect((ip, 50000))


try:
    while True:
        nachricht = raw_input("Nachricht: ")
        meinSocket.send(nachricht)
        antwort = meinSocket.recv(1024)
        print "[%s] %s" % (ip,antwort)
finally:
    meinSocket.close()
dazu ist sind fragen eig. warum das socket erst nach der ip = raw.... erstellt wird, warum nach demm meinSocket.connect ein ip steht und wieso im print teil jetzt ip und antwort in der klammer steht

ich blick da noch nicht ganz durch.

Wäre echt schön von euch wenn ihr mir die Fragen dazu beantworten könntet und später wenn noch zeit bleibt evtl ein paar verbesserungsvorschläge oder noch funktionen, wo ich vorarbeiten kann.

Aber die fragen sind mir erstmal wichtiger

MfG CodeMaster

Re: Chatprogramm // Fragen zu Funktionen

Verfasst: Mittwoch 15. September 2010, 23:16
von Yggel
Edit: Grade erst die Kommentare im Code entdeckt! Ich werd versuch das ganze etwas ausführlicher zu beantworten :)
CodeMaster hat geschrieben:

Code: Alles auswählen

import socket
meinSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)     // Was bedeutet AF_INET und SOCK_STREAM?
Das sind Konstanten, die das Verhalten des Sockets bestimmen.
Details weiß ich leider nicht, nur soviel:
AF_INET sorgt dafür, dass der Socket IPv4 benutzt (also Adressen in dem Format 127.0.0.1).
SOCK_STREAM ist meine ich dafür verantworlich, dass TCP als Protokol genutzt wird -
Ich bin aber auch noch sehr unerfahren was Netzwerk-Programmierung angeht.

Code: Alles auswählen

meinsocket.bind(("", 50000))              //was bedeutet bind?, wieso sind die Anführungsstriche leer? und was ist 50000 ?
bind setzt ("bindet") den Socket an einen bestimmten Port, hier 50000, damit du die Nachrichten empfangen kannst.
Falls du mit Ports nichts anfangen kannst, wird hier erklärt wozu es die gibt.

Code: Alles auswählen

meinSocket.listen(1)               // was wird mit listen(1) gemeint?
listen sagt dem Socket, dass er nach Verbindungen horchen soll, die 1 hat mit den maximalen Verbindungen zu tun, aber auch hier bin ich mir nicht sicher.

Code: Alles auswählen

try:
    while True:
        komm, addr = meinSocket.accept()             // wenn man wörter in einer Zeile schreibt werden gleich mehrere Variablen erzeugt oder was?
accept() gibt hier ein Tupel oder eine Liste zurück und damit man auf die Elemente nicht über den Index zugreifen muss, werden sie einfach entpackt.
Bsp:

Code: Alles auswählen

x, y = ('Hello', 'World')
Hier werden zwei Variablen angelegt (x und y) x hat jetzt den Wert 'Hello', y den Wert 'World'.

Code: Alles auswählen

        while True:
            data = komm.recv(1024)                      //was ist recv(1024)
recv steht für recieve, hier werden 1024 Byte Daten von der Verbindung gelesen

Code: Alles auswählen

            if not data:                             
                komm.close()                     // wieso ist nach komm.close() ein break und nach finally nicht?
                break
Die While-Schleife hier hat keine Bedingung, die sie beenden könnte (True ist eben immer wahr), also muss man sie manuell beenden, undzwar dann, wenn man keine Daten mehr gesendet bekommt. das finally ist in keiner Schleife, ergo kein Grund zum breaken

Code: Alles auswählen

            print "[%s] %s" % (addr[0], data)            //print stellt ja irgendetwas dar, aber was kann ich mir nicht erklären und vorallem diese komischen Prozentzeichen nicht
Hier werden Variablen-Werte ausgegeben. %s bedeutet, dass hier ein String eingesetzt werden soll - welcher String eingesetzt wird steht in der Klammer dahinter.
Bsp:

Code: Alles auswählen

print '%s %s' % ('Hello', 'World')
-> 'Hello World'
Bsp2:

Code: Alles auswählen

x = 'Hello World'
print '%s' % x
-> 'Hello World'
Die Klammer ist also nur nötig, wenn man mehrere Einsetzungen vornimmt

Code: Alles auswählen

            nachricht = raw_input("Antwort: ")          // Hier wird anscheinend solange darauf gewartet bis man etwas eingibt, bevor es weiter geht oder?
Genau. das 'raw_' vor dem input sorgt dafür, dass das was man eingibt nicht als Python-Code interpretiert wird, sondern als String behandelt.

Code: Alles auswählen

            komm.send(nachricht)         //wird hier die nachricht geschickt? und wenn ja woher weiß ich wohin?
finally:
    meinSocket.close()
Jup da wird die Nachricht geschickt. Empfänger ist derjenige, dessen Verbindung du vorher mit meinSocket.accept() angenommen hast.

Der Client:

Code: Alles auswählen

import socket
ip = raw_input("IP-Adresse: ")
meinSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mein socket.connect((ip, 50000))


try:
    while True:
        nachricht = raw_input("Nachricht: ")
        meinSocket.send(nachricht)
        antwort = meinSocket.recv(1024)
        print "[%s] %s" % (ip,antwort)
finally:
    meinSocket.close()
dazu ist sind fragen eig. warum das socket erst nach der ip = raw.... erstellt wird, warum nach demm meinSocket.connect ein ip steht und wieso im print teil jetzt ip und antwort in der klammer steht
Den Socket könnte man tatsächlich schon vorher erstellen - verbinden kann man allerdings erst, wenn man die IP-Adresse hat, daher kann man ihn ebensogut nach der Eingabe anlegen.
'ip' ist die Variable in die du die Ziel-Adresse geschrieben hast (bei ip = raw_input[...]).
Das Tupel in meinSocket.connect() ist also die IP-Adresse des Ziels, sowie der Port zu dem man sich verbinden möchte.
Die Ausgabe (print) ist hier im wesentlichen die gleiche wie oben im Server.
Im Client gibst du die IP-Adresse selbst ein, daher ist es leicht sie einfach wieder auszugeben - im Server hingegen weißt du ja garnicht, wer sich da jetzt zu dir verbunden hat, deshalb musst du diese Information aus der bestehenden Verbindung ziehen (addr[0]), dazu wird noch die Nachricht des Servers ausgegeben.

Puh.. so ich hoffe das Ganze ist ein wenig klarer geworden :)
Ich programmiere selber noch nicht sehr lange, falls ich also irgendwo falsch liege bitte ich um Verzeihung! Aber ich bin sicher dann wird mich jemand berichtigen.

Grüße,

Yggel

Re: Chatprogramm // Fragen zu Funktionen

Verfasst: Mittwoch 15. September 2010, 23:50
von Leonidas
Hallo Codemaster, willkommen im Forum,
CodeMaster hat geschrieben:Was bedeutet AF_INET und SOCK_STREAM?
Findest du in der Dokumentation des socket-Moduls.
CodeMaster hat geschrieben:was bedeutet bind?, wieso sind die Anführungsstriche leer? und was ist 50000 ?
``bind`` ist eine methode auf dem Socket-Objekt, die leeren Anführungszeichen bedeuten "leerer String" und 50000 ist eine Zahl, nämlich der Port.
was wird mit listen(1) gemeint?
Die Methode ``listen`` mit dem Parameter 1 aufgerufen.

Was die einzelnen Methoden machen steht ebenfalls in der socket-Dokumentation.
CodeMaster hat geschrieben:wenn man wörter in einer Zeile schreibt werden gleich mehrere Variablen erzeugt oder was?
Nein, das ist Tuple-Unpacking. ``accept`` gibt ein Tupel zurück, dessen erster Teil wird an ``komm`` gebunden, der zweite Teil an ``addr``.
CodeMaster hat geschrieben:was ist recv(1024)
Ein Methodenaufruf von ``recv`` mit dem Parameter 1024. Er gibt dir die Bytes zurück, die gelesen wurden.
CodeMaster hat geschrieben:wieso ist nach komm.close() ein break und nach finally nicht?
Weil das hier innerhalb einer Schleife ist und im ``finally``-Teil nicht mehr. Aber das ist ja in C++ nicht anders…
CodeMaster hat geschrieben:print stellt ja irgendetwas dar, aber was kann ich mir nicht erklären und vorallem diese komischen Prozentzeichen nicht
``%s`` ist ein Platzhalter für einen Wert, in das erste wird der Wert von ``addr[0]`` eingesetzt, in das zweite der Wert von ``data``.
CodeMaster hat geschrieben:Hier wird anscheinend solange darauf gewartet bis man etwas eingibt, bevor es weiter geht oder?
Probier es doch in der Python-Konsole aus.
CodeMaster hat geschrieben:wird hier die nachricht geschickt? und wenn ja woher weiß ich wohin?
Naja, da die Kommunikation nur zwischen 2 Punkten besteht, denk doch mal logisch nach an wen die Nachricht gehen kann. Hint: selbstgespräche sind reichlich sinnlos.

Re: Chatprogramm // Fragen zu Funktionen

Verfasst: Donnerstag 16. September 2010, 07:54
von CodeMaster
Gut das hab ich schonmal verstanden, danke!

Jetzt hätte ich noch eine frage :)

Wie müsste ich das ganze jetzt umbauen, um mit mehreren zu schreiben?
Ich will jetzt hier keine Lösungsprodukte sondern informationen und die entsprechenden funktionsnamen,
weil da kenn ich erst recht wenige :roll:
Aber ich bin sicher, das ihr mir schon helfen könnt :)

MfG CodeMaster

Re: Chatprogramm // Fragen zu Funktionen

Verfasst: Donnerstag 16. September 2010, 10:39
von jbs
Wieso fängt man nach wenigen wochen schon mit sockets an?

Die einfachste Möglichkeit währen Threads. Und dann brauchst du noch einen Mapper, der die Nachrichten an die richtigen User sendet. Und eine kleine parsing Funktion, wenn du etwas wie `@name: Hallo` zulassen willst.

Re: Chatprogramm // Fragen zu Funktionen

Verfasst: Donnerstag 16. September 2010, 13:38
von CodeMaster
Ok also:
Ich hab schon ahnung von Programmieren, mein problem ist eig. nur das voklabeltraining sozusagen^^
ich weiß was Integers sind bishin zu structs etc aber da mir diese ganzen funktionsnamen fehlen usw
will ich erstmal konkret fragen, ob es sowas wie eine functionlist gibt oder so, wo man sich zum beispiel print angucken kann, welche parameter es braucht.
In der Documentation hab ich auch scchonmal rumgeguckt, ist aber alles noch ein wenig kompliziert, weil es 1. auf english ist und es 2. viele fremdbegriffe enthält.
Ok dann werde ich erstmal auf das Thema Threads eingehen..

1.) Threads
Was sind Threads?
Wofür werden sie gebraucht?
Wie sind sie aufgebaut?
Wann sollte man sie benutzen?

2.) Mapper
Ist ein Mapper eine art Gruppe, in der die ganzen ip-Adressen gespeichert werden und nachrichten an eine bestimme ip sendet?
also ungefährt sowas?
Mapper = Mapper.create()
Mapper.add(ip)
Mapper.send(ip,nachricht)

3.) parsing FUnktion
Was genau macht diese funktion?
wie wende ich sie an?
wann wende ich sie an?

So das wars erstmal :D
Wenn jemand eine Dokumentation auf deutsch oder eine Funktionsliste hat, immer her damit :D

Achja ich kenn mich nicht so aus aber ich benutz IDLE python für windows, das benutzen wir auch in der Schule blos für Ubunto oder so

MfG CodeMaster

Re: Chatprogramm // Fragen zu Funktionen

Verfasst: Donnerstag 16. September 2010, 13:45
von BlackJack
@CodeMaster: Das ist IMHO alles zu viel für einen Anfänger. Sockets sind schon nicht so einfach, aber Threads sind definitiv nicht mehr Anfängermaterial.

Du bittest bei den Funktionen im Grunde darum, dass Dir jemand die Dokumentation vorliest. Viel Glück so jemanden zu finden. Durch das Englisch musst Du durch. Programmieren ist auf Dauer nicht machbar wenn man die Dokumentation der Bibliotheken nicht lesen kann, und die sind eben üblicherweise in Englisch.

Re: Chatprogramm // Fragen zu Funktionen

Verfasst: Donnerstag 16. September 2010, 13:53
von yipyip
Socket-Programmierung im Schulunterricht halte ich auch für etwas zuviel des Guten... :shock:
Ein schöne Einführung (leider auf Englisch) bietet
http://www.ibm.com/developerworks/linux ... l-pysocks/
Das Level ist aber schon "intermediate"!

:wink:
yipyip

Re: Chatprogramm // Fragen zu Funktionen

Verfasst: Donnerstag 16. September 2010, 14:34
von jbs
Darf ich fragen wie alt du bist, bzw. in welcher Klasse?

Ich halte von der Vorgehensweise deines Lehrers für vollkommen falsch. Wenn man jemanden Programmieren beibringen will, dann sollte man grundlegende Eigenschaften der Sprache vermitteln. Das heißt Funktionen/Methoden und der Umgang mit den verschiedenen Datentypen. Wir bekamen in der Anfangszeit auf, zu überprüfen, ob zwei Wörter Anagramme oder Palindrome sind und lauter solcher kleiner Aufgaben. Die erste Klausur war dann ein Morsecode-Übersetzer.
Hat man diese Grundlagen verinnerlicht, macht es IMHO Sinn, mit der Objektorientierung anzufangen. Da doktert man auch weiter rum und hat damit eine solide Basis auf die man nun aufbauen kann. Das dauert aber erstmal so ein Jahr.
Dann kann man sich überlegen, womit man denn weitermachen möchte. Sind es GUI, Netzwerkprogrammierung, Threads oder ein anderes spezielleres Thema, wie zum Beispiel die Integration in das Betriebssystem, oder, oder, oder.

Vergiss also bitte sockets und Threads und versuche dich am Tutorial, das es auch auf Deutsch gibt (siehe Signatur).
Da wir gerade dabei sind: Englisch ist einfach die Sprache der Programmierung und daher wirst du nicht um sie herum kommen. Zum Glück sind die Dokumentationen keine literarischen Texte und daher leicht verständlich. Zur Not gibts ja noch leo.org.

Ich halte IDLE zum Programmieren für nicht sehr geignet. Für den Anfang ist das ganz nett, aber hat auch so seine Nachteile. Unter Windows verwende ich Scite. Das hat alles was ich im Prinzip will, um zumindest mittelgroße Projekte zu bewältigen und ist dafür nicht zu überladen.

Re: Chatprogramm // Fragen zu Funktionen

Verfasst: Donnerstag 16. September 2010, 14:42
von jbs
Generell gilt, erst einfach mal Google bemühen und schauen, ob du nicht so schon deine Antworten findest.
CodeMaster hat geschrieben: 1.) Threads
Was sind Threads?
Wofür werden sie gebraucht?
Wie sind sie aufgebaut?
Wann sollte man sie benutzen?
Man benötigt Threads, um teile deines Programmes parallel laufen zu lassen. Jeder Thread würde sich dann um eine Verbindung zu einem User kümmern und relativ unabhängig zu den anderen Threads agieren.
Wie schon gesagt wurde, eigentlich nichts für Beginner.
CodeMaster hat geschrieben: 2.) Mapper
Ist ein Mapper eine art Gruppe, in der die ganzen ip-Adressen gespeichert werden und nachrichten an eine bestimme ip sendet?
also ungefährt sowas?
Mapper = Mapper.create()
Mapper.add(ip)
Mapper.send(ip,nachricht)
Ein Mapper ist ein Objekt, dass dir aus einer Eingabe eine passende Antwort liefert.
Du würdest in deinem Fall durch den Mapper mit hilfe des Benutzernamens eines anderen Users dessen socket Objekt erfragen und könntest ihm dann die Nachricht zusenden.
Python kennt für die Zuordnung zwischen Schlüssel und Wert das Dictionary.
CodeMaster hat geschrieben: 3.) parsing FUnktion
Was genau macht diese funktion?
wie wende ich sie an?
wann wende ich sie an?
Der Parser würde sich die Nachricht eines Users anschauen und entscheiden was es damit macht.