Mit Python Socket localhost öffnen?

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?


bishare 
Beitragsersteller
 17.09.2021, 16:48

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.

0
KarlRanseierIII  17.09.2021, 16:50
@bishare

Okay, wir sprechen also von einem Server, auf was bindest du denn den socket der auf Verbindungen warten soll?

1
bishare 
Beitragsersteller
 17.09.2021, 16:53
@KarlRanseierIII

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.

0
KarlRanseierIII  17.09.2021, 16:59
@bishare

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.

1
bishare 
Beitragsersteller
 17.09.2021, 17:10
@KarlRanseierIII
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?

0
KarlRanseierIII  17.09.2021, 17:57
@bishare

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.

1
bishare 
Beitragsersteller
 17.09.2021, 20:02
@KarlRanseierIII

boah vielen dank für deine hilfe! bist echt mein held für die nächsten 2 monate

0
KarlRanseierIII  17.09.2021, 21:03
@KarlRanseierIII
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 ..

0
bishare 
Beitragsersteller
 18.09.2021, 15:36
@KarlRanseierIII

Hey, habe die schleife für unser Problem mal false gesetzt, weil der immer eine Fehlermeldung angegeben hat. kannst du beim programm localhost öffnen?

0
KarlRanseierIII  18.09.2021, 21:02
@bishare

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.

0

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.

Woher ich das weiß:Berufserfahrung – Softwareentwicklerin

bishare 
Beitragsersteller
 17.09.2021, 16:46

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?

0