Mit Python Socket localhost öffnen?
wenn ich eine Socket mit Python öffne mit einer IP Adresse (192.xxx.xxx.25), kann ich gleichzeitig auch auf localhost zugreifen? Will nämlich noch eine Webseite erstellen im Serverprogramm. Die Verbindung funktioniert wird auch in der Shell angezeigt, auch die Kommunikation, weiß aber nicht wie ich jetzt auf localhost zugreifen kann,
(localhost:8080 , localhost:5050 , localhost/IP_adresse habe ich schon ausprobiert)
2 Antworten
Kannst Du das etwas präzisieren? Ein Socket ist für genau eine Verbindung zuständig. Du mußt also bei mehreren Verbindungen eben auch mehrere Sockets nutzen.
Oder funktioniert generell die lokale Kommunikation nicht?
Okay, wir sprechen also von einem Server, auf was bindest du denn den socket der auf Verbindungen warten soll?
Sorry falls ich unsinn schreibe, bin noch ein Anfänger.
Binden tu ich auf eine IP-Adresse (192.xxx.xxx.25)
SERVER = socket.gethostbyname(socket.gethostname())
was auch alles perfekt funktioniert. Kann von einem Programm ein Hello World starten und mein Serverprogramm gibt es dann aus. Aber neben den Server, brauche ich noch einen Webserver.
Wen wir bei IPv4 bleiben, dann kannst du einen INADDR_ANY bind machen, dann kann der Socket Verbindungen auf alle Interfaces annehmen, dafür bleibt der Host beim bind() einfach leer in Python:
somesock.bind('',port)
Willst Du explizite binds nutzen, dann brauchst Du einen lauschenden Socket je Interface.
import socket
import threading
HEADER = 64
PORT = 5050
SERVER = socket.gethostbyname(socket.gethostname())
ADDR = (SERVER, PORT)
TEST = ("",PORT)
FORMAT = 'utf-8'
DISCONNECT_MESSAGE = "!DISCONNECT"
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(TEST)
def handle_client(conn, addr):
print(f"[NEW CONNECTION] {addr} connected.")
connected = True
while False: (wenn ich mich mit localhost verbinden will kriege ich eine fehlermeldung, weil ich keine message habe, habs deswegen mal auf False gesetzt)
msg_length = conn.recv(HEADER).decode(FORMAT)
if msg_length:
msg_length = int(msg_length)
msg = conn.recv(msg_length).decode(FORMAT)
if msg == DISCONNECT_MESSAGE:
connected = False
print(f"[{addr}] {msg}")
conn.send("Msg received".encode(FORMAT))
conn.close()
def start():
server.listen()
print(f"[LISTENING] Server is listening on {SERVER}")
while True:
conn, addr = server.accept()
thread = threading.Thread(target=handle_client, args=(conn, addr))
thread.start()
print(f"[ACTIVE CONNECTIONS] {threading.activeCount() - 1}")
print("[STARTING] server is starting...")
start()
Damit du weißt, wie mein Code aussieht, hab ich es mal hier reingeschickt. Habe deinen Verbesserungsvorschlag mal umgesetzt und die Verbindung wird zwar registriert, wenn ich localhost:5050 aufrufe, aber angezeigt wird, dass die webseite nicht verfügbar ist.
die shell gibt das aus, wenn ich localhost aufrufe
[ACTIVE CONNECTIONS] 2[NEW CONNECTION] ('127.0.0.1', 54033) connected.[ACTIVE CONNECTIONS] 3[NEW CONNECTION] ('127.0.0.1', 49674) connected.[ACTIVE CONNECTIONS] 2[NEW CONNECTION] ('127.0.0.1', 62580) connected.
kannst du vielleicht was damit anfangen und weißt du wieso localhost nicht aufrufbar ist?
Ich schaue mir das gerade mal direkt an, Er gibt zwar aus, daß er an 127.0.0.1 gebunden hat, allerdings sagt netstat:
tcp 0 0 0.0.0.0:5050 0.0.0.0:* LISTEN 32447/python
Gebunden ist also von python ein Socket an INADDR_ANY Port 5050, der Teil scheint korrekt zu sein. Wenn ich versuche auf den Port zu connecten bekomme ich ein direktes Connection closed.
Ausgabe des Skriptes dabei:
[NEW CONNECTION] ('192.168.33.254', 40158) connected.
[ACTIVE CONNECTIONS] 0
[NEW CONNECTION] ('192.168.0.181', 50204) connected.
[ACTIVE CONNECTIONS] 1
[NEW CONNECTION] ('127.0.0.1', 53284) connected.
[ACTIVE CONNECTIONS] 1
Das sieht soweit erstmal richtig aus. Ich schaue mir den HAndler mal in Ruhe an, ob ich sehe, wo das Problem liegt.
boah vielen dank für deine hilfe! bist echt mein held für die nächsten 2 monate
msg_length = int(msg_length)
Vertraue nie dem Kommunikationspartner, gehe davon aus, daß etwas beliebiges gesendet wurde.
Jenseits dessen sehe ich auf Anhieb erstmal keine sonstigen Probleme. (Naja, außer: Was machste, wenn ein Formatfehler vorliegt ..
Hey, habe die schleife für unser Problem mal false gesetzt, weil der immer eine Fehlermeldung angegeben hat. kannst du beim programm localhost öffnen?
Ich habe der Einfachheit telnet genommen, bei der Schleife habe ich entsprechend while connected genommen. Das Problem ist natürlich, daß wenn ich irgendetwas sende, obwohl ein int erwartet wird, eine exception geworfen wird (was zu erwarten ist).
Allgemein mußt Du solche Sachen abfangen, denn Du willst ja, daß der Serve robust läuft.
Du möchtest sowohl über das interne Netz als auch über Localhost auf die Seite zugreifen können? Dann kannst du als IP bei der Erstellung angeben, dass der Socket auf die IP 0.0.0.0 hört. Damit wird dann bei jeder Anfrage auf dem Port reagiert, egal zu welchem Interface es gehört. Im lokalen Netz ist das auch ok.
Habe als IP jetzt 0.0.0.0 eingestellt und mein Port ist 5050. Mit localhost:5050 bzw localhost/5050 (oder mit 8080) kann ich die seiten immer noch nicht aufrufen, obwohl die verbindung aktiviert ist. muss ich da noch was machen, damit es aktiviert wird, oder ist bei mir was kaputt?
Du solltest über http://localhost:5050 auf diesen Server kommen, wenn es das gleiche Gerät ist, das die Seite auch hostet.
Hey,
ich wollte anfangs ein Webserver erstellen, welches mit einem anderen Programm kommunizieren kann. Jetzt ist die Sache die, dass ich zwar die Verbindung hinbekomme vom Socket, ich aber noch ein localhost brauche, der als Webserver dienen soll.
Hast du da vielleicht Ideen oder Vorschläge wie man das umsetzen kann, weil ich nur auf HTTP Request und auf Sockets gekommen bin.