Funktioniert dieses Programm auch über Internet?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

client.py

Code: Alles auswählen

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ip = input("IP: ")
message = input("message: ")
s.sendto(message.encode(), (ip, 50000))
s.close()
server.py

Code: Alles auswählen

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
try:
	s.bind(("", 50000))
	while True:
		data, addr = s.recvfrom(1024)
		print("[{}] {}".format(addr[0], data.decode()))
finally:
	s.close()
Das ist ein einfaches Chatprogramm. Hab's über's Internet gestestet, allerdings hat der Computer, der server.py ausführen sollte, nichts empfangen. Beim dreimaligen Versuchen nicht. Könnte es daran liegen, dass UDPund nicht TCP genutzt wird, oder funktioniert das Programm über das I-Net nicht?
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Hast du daran gedacht, in dem Netzwerk, in dem 'server.py' gestartet wird, an allen Stellen, die zwischen dem Rechner und dem Internet liegen (z.B. Router), entsprechende Freigaben und Weiterleitungen einzurichten?
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Nein. Um ehrlich zu sein, verstehe ich nicht mal so wirklich was damit gemeint ist.
Die Nachricht des Clients wird ja, wenn ich die öffentliche IP des Zielrechners eingebe, zum Zielrechner geschickt. Über den Port 50000 wird dann die Nachricht zum Programm geschickt, dass diesen Port anzapft. So habe ich das verstanden.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Dexter1997: wie sind denn Deine Rechner miteinander Verbunden?
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

In Privathaushalten steht heute ja meistens ein DSL-Router, der mit dem Internet verbunden ist und sozusagen als Vermittler zwischen dem lokalen Netzwerk und dem Internet dient. Die öffentliche IP ist die des Routers. Geräte im Netzwerk haben lokale IPs. Netzwerktraffic von außen wird vom Router an diese lokalen Adressen weitergeleitet (NAT). Damit das in dem Fall funktioniert, musst du im Router eine UDP Weiterleitung von Port 50000 auf die lokale IP des Rechners, auf dem der Server läuft, einrichten.
Zuletzt geändert von nezzcarth am Samstag 30. Dezember 2017, 11:54, insgesamt 1-mal geändert.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Verstehe.
Gibt es da noch einen einfacheren Weg? Andere Chatprogramme verlangen ja auch nicht, dass da erst irgendwas umständliches im Router eingerichtet wird, bevor man chatten kann.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Grundsätzlich löst man dass indem man keine direkte Verbindung aufbaut, sondern über einen Server kommuniziert zu dem sich alle verbinden.
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

@Dexter1997: Ergänzend zu dem, was DasIch meinte:
In Messengern (früher) waren genau diese Portfreigaben oft das Problem, warum das Verschicken von Dateien nicht geklappt hat. Während die reguläre Chatkommunikation über Server lief, wurde für Dateitransfer eine Direktverbindung aufgebaut. Ich fürchte, die Portfreigaben bleiben dir nicht erspart.
Zuletzt geändert von nezzcarth am Samstag 30. Dezember 2017, 12:12, insgesamt 1-mal geändert.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Aber der Server muss ja letzenendes auch wieder eine direkte Verbindung zum Rechner aufbauen, um ihm die Nachricht zu schicken. Anders funktioniert das ja nicht :/

Und dann gibt es da noch eine Sache, die ich nicht verstehe. Das Thema Netzwerke ist auf den ersten Blick ziemlich verwirrend, habe ich den Eindruck.

Es gibt ja die sogenannten Sockets. Ein Programm, dass Daten mit anderen Programmen austauschen will (egal ob beide Programme auf demselben Rechner sind oder nicht), braucht einen Socket.
Das heißt, Programme kommunizieren über Sockets, Wobei also jeweils Client und Server einen Socket haben, wenn ich das richtig verstanden habe.
Dann ist aber noch von sogenannten Ports die Rede. Ports ermöglichen die Zuordnung von Netzwerkverbindungen zu Programmen durch Betriebssysteme. Klingt so, als wäre das dasselbe wie ein Socket. Was ist der Unterschied zwischen einem Socket und einem Port?
Gibt es vielleicht eine gute Einleitung in das Thema Netzwerke? In meinem Buch über Python, in dem es gerade um Netzwerke geht, habe ich das Gefühl, dass das Thema für Neulinge eher oberflächlich erklärt wird.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Dexter1997: Das ganze kann noch viiiiiiel komplizierter sein - du kratzt gerade mal an der Oberfläche.

Port und Socket sind nicht das gleiche. Bei Wikipedia. Zitat: "Primär sind Ports ein Merkmal zur Unterscheidung mehrerer Verbindungen zwischen demselben Paar von Endpunkten."

Dein Rechner hat eine IP-Adresse, diese kann 65535 verschiedene Ports für verschiedene Verbindungen / Protokoll benutzen. So nutzt z.B. HTTP standardmäßig Port 80, HTTPS 443, IMAPS 993, SSH 22 usw. Gäb's da nicht, wäre eine gleichzeitige Verbindung nicht möglich.
Ein Programm, dass Daten mit anderen Programmen austauschen will (egal ob beide Programme auf demselben Rechner sind oder nicht), braucht einen Socket.
Nee, das geht auch anders. Socketprogrammierung ist eher so der unterste Level, mit dem man das macht. Was willst du denn für Daten austauschen?
In meinem Buch über Python, in dem es gerade um Netzwerke geht,
Welches Buch nutzt du?

Gruß, noisefloor
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

https://www.amazon.de/Python-umfassende ... n+handbuch

Das ist das Buch, dass ich nutze.
Ein bisschen Erfahrung in Python habe ich bereits, das meiste kann ich durch querlesen in verschiedenen Quellen. Folgendes Beispiel zeigt ungefähr meinen Wissensstand (habe ich gemacht):

https://codereview.stackexchange.com/qu ... wise-words

Ich denke, dass ich bereit bin, Python nicht chronologisch lernen zu müssen und bin in diesem Buch direkt in die Netzwerkprogrammierung eingestiegen, ohne großartig was anderes vorher zu lesen. Ich schätze also, mangelnde Programmierkenntnisse sollten nicht das Problem sein, eher mein schlechter Wissensstand über Netzwerke.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

bleibt immer noch die Frage, welche Daten du übertragen willst.

Gruß, noisefloor
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Dexter1997 hat geschrieben:Dann ist aber noch von sogenannten Ports die Rede. Ports ermöglichen die Zuordnung von Netzwerkverbindungen zu Programmen durch Betriebssysteme. Klingt so, als wäre das dasselbe wie ein Socket. Was ist der Unterschied zwischen einem Socket und einem Port?
Vielleicht hilft Dir eine (wie so oft hinkende) Analogie: Stell Dir eine Stadt mit vielen Häusern vor. Jedes Haus hat eine eigene Adresse; das ist die IP. In jedem Haus gibt es eine Vielzahl von Dienstleistungen (Bäcker, Schuster, etc. -> Apache, Nginx, Datenbank, usw.). Diese erreichst Du durch eine für jeden Dienst eigens numerierte Tür; das ist der Port. Hinter jeder Tür steht aber zunächst einmal der Butler; das ist der Socket - dieser empfängt Dich (die Daten); und er achtet auf das Protokoll. Benimmst Du Dich daneben (falsches Protokoll), dann bekommst Du Schwierigkeiten. Vor den Häusern mit den Türen gibt es aber außerdem - wie bei Clubs - noch die Rausschmeißer. Die lassen Dich unter Umständen erst gar nicht durch, selbst wenn die Türen offen sind; das sind Firewalls.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Zur Frage, welche Daten ich übertragen will:
So, wie ich das verstanden habe, überträgt UDP einfach Byte-Objekte. Byte-Objekte können, wenn ich das richtig verstanden habe, alles mögliche sein: Filme, Bilder, Textnachrichten usw. sie müssen nur mit der Funktion encode() zu Byte-Objekten gemacht werden (warum auch immer, denn streng genommen sind die besagten Dinge ja sowieso schon "Objekte", die aus "Bytes" bestehen, sowie alles in der Software-Welt.

Also kurz und knapp: Ich möchte per UDP Byte-Objekte übertragen.

Zur Analogie:
Sind die Butler in deiner Analogie die Sockets?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@Dexter1997: das ist aber sehr vage... warum nennst du nicht deinen konkreten use-case? Wie du richtig sagst, Byte-Objekte können alles sein. Und du bist mit Sicherheit nicht heute morgen aufgewacht und hast gedacht: "Heute ist mir mal danach, Byte-Objekte zu übertragen".

Dir ist auch klar, dass du bei UDP keine Garantie hast, dass die Daten jemals ankommen?

Gruß, noisefloor
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Die Sache ist die, dass ich keinen konkreten "use-case" habe. Ich habe das Programm nur zum Üben benutzt. Konkreter ausgedrückt wollte ich in diesem Zeichenketten, also Textnachrichten übertragen, die der Empfänger lesen kann. Das hatte innerhabl des lokalen Netzwerkes gut funktioniert.

Mir ist klar, dass die per UDP übertragenen Daten nicht ankommen könnten. Aber dieses Risiko habe ich mal in Kauf genommen, da ich den Umgang mit
TCP erst noch erlerne :D
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Dexter1997: Du weißt nicht, wie man UDP benutzt, denkst aber dass Du es besser beherrschst als TCP? Du findest im Internet und in den meisten Büchern, die nicht explizit Netzwerkprotokolle behandeln, zu 99.99% nur fehlerhafte Beispiele. Weder TCP noch UDP werden meist korrekt umgesetzt. Daher will man ja auch höhere Protokolle einsetzen, zu allervorderst HTTP, weil man damit durch fast alle Firewalls durchkommt.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Nunja, sagen wir es genauer: Ich weiß, wie ich ein Python-Programm dazu bringe, eine UDP-Verbindung zu einem anderen Programm aufzubauen. Sonst hätte ich ja die gezeigten Programme nicht schreiben können.
Ich erlerne den Umgang mit UDP und TCP, nicht, wie sie im Einzelnen funktionieren. Ich denke, das reicht für einen Anwendungsprogrammierer auch aus.
HTTP kann meines Wissens allerdings nur Textdateien übertragen, wobei meistens nur HTML-Dateien übertragen werden.
Hättest du vielleicht ein Beispiel parat, wie man so ein Chatprogramm, wie ich es geschrieben habe, mit der Nutzung des HTTP-Protokolls realisiert?
Das wäre sehr interessant für mich.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Dexter1997 hat geschrieben:Ich erlerne den Umgang mit UDP und TCP, nicht, wie sie im Einzelnen funktionieren. Ich denke, das reicht für einen Anwendungsprogrammierer auch aus.
Du weißt, dass dein o.g. Problem erstmal nichts mit UDP / TCP zu tun hat? Letzteres sind Protokolle, die je nach Anwendungsart eingesetzt werden. UDP i.d.R. für Echtzeitanwendungen z.B. Internettelefonie / VoIP - hier ist wurst ob einzelne Frames flöten gehen, die Übertragung muss besonders verzögerungsfrei sein. Bei TCP soll die Vollständigkeit der Daten gewährleistet werden, wird meist bei verbindungsorientierten Sitzungen, wie bspw. HTTP eingesetzt.
Dexter1997 hat geschrieben:HTTP kann meines Wissens allerdings nur Textdateien übertragen, wobei meistens nur HTML-Dateien übertragen werden.
Gegenfrage, mit welchem Protokoll spricht dein Rechner / Internetbrowser wenn du eine Seite ansurfst, und Bilder angezeigt werden?

Wenn du mit zwei Clients von Standort A nach B und vice versa kommunizieren möchtest, wirst du einen Server als Vermittler benötigen, der die Daten vollständig, sicher und an das richtige Ziel ausgibt. Du hast also nicht nur ein Problem dass du erstmal am Standort des Servers entsprechende Portfreigaben einrichten musst, sondern, dass dieser u.U. multithreading-fähig o.ä. ist, und weiß, wann eine Nachricht "vollständig" ist, da TCP zunächst ein endloser Byte-Stream ist. Zusätzlich sollte die Übertragung der Daten verschlüsselt übertragen werden. Eine Applikation zu schreiben, die über keinerlei Schutzmechanismen verfügt und auf einem Netzwerkport WAN-seitig Anfragen entgegennimmt würde ich sowieso in eine DMZ verfrachten.

UDP ist IMO absolut nicht geeignet für die Erstellung eines Chat-Servers.

Mfg, sls
When we say computer, we mean the electronic computer.
Antworten