Hallo,
wir sollen für die Uni ein Verteiltes System in einer Sprache unserer Wahl schreiben. Ein Teil davon ist es, einen HTTP-Server nur mit Sockets zu schreiben, ich darf also keine HTTP-Bibliotheken benutzen. Leider bereitet mir das ganze große Probleme. Da es in meinem großen Projekt überhaupt nicht funktioniert hat, habe ich ein kleines Dummyprojekt erstellt, doch auch da funktioniert es nicht so wie ich es mir vorstelle. Als OS kommt Linux (Arch) zum Einsatz. Es muss ein TCP-Socket sein, UDP-Sockets werden im Projekt an anderer Stelle benutzt und funktionieren bei mir auch wunderbar.
Dummyprojekt:
Was ich mir vorstelle was das Programm macht: Auf einem von mir bestimmter IP (127.0.0.1) und einem Port (z.B. 2001) wird ein Socket erstellt. Dieser wird gebunden und das Programm geht in die while True Schleife über. Nun warted es auf eine Connection, akzeptiert diese und schickt ein HTTP 200 OK mit Hello World und schließt die connection. Dann wartet es auf eine erneute Anfrage.
Problem: Es wird erst eine Antwort geschickt, wenn ich das Python programm beende. Meine Vermutung ist, dass die Daten im Buffer des Sockets landen und deshalb erst geschickt werden, wenn der Socket geschlossen wird. Also setze ich testweise die Buffergröße auf 1 Byte:
Doch das funktioniert nicht... Dann habe ich mir gedacht, ich schicke einfach leere Daten hinterher (Leerzeichen), sodass der Buffer zwangsläufig volläuft und gesendet werden muss:
Das ganze funktioniert manchmal, also vermutlich nur, wenn ich mit meinen Leerzeichen ufälligerweise genau die verbleibende Buffergröße treffe...
Wie mache ich das ganze richtig? Wie kann ich einfach Daten über eine TCP Verbindung schicken, wann ich will?
Vielen Dank!
wir sollen für die Uni ein Verteiltes System in einer Sprache unserer Wahl schreiben. Ein Teil davon ist es, einen HTTP-Server nur mit Sockets zu schreiben, ich darf also keine HTTP-Bibliotheken benutzen. Leider bereitet mir das ganze große Probleme. Da es in meinem großen Projekt überhaupt nicht funktioniert hat, habe ich ein kleines Dummyprojekt erstellt, doch auch da funktioniert es nicht so wie ich es mir vorstelle. Als OS kommt Linux (Arch) zum Einsatz. Es muss ein TCP-Socket sein, UDP-Sockets werden im Projekt an anderer Stelle benutzt und funktionieren bei mir auch wunderbar.
Dummyprojekt:
Python:
import socket
import sys
ip = sys.argv[1]
port_http = int(sys.argv[2])
http_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Internet and TCP
http_s.bind((ip, port_http))
http_s.listen(10)
while True:
conn, addr = http_s.accept()
test123 = "HTTP/1.1 200 OK\n" + "Content-Type:text/html\n" + "Content-Length:" + str(sys.getsizeof("Hello World")) + "\n" + "\n" + "<html><body>" + "Hello World" + "</body></html>\n"
conn.send(test123.encode('UTF-8'))
Was ich mir vorstelle was das Programm macht: Auf einem von mir bestimmter IP (127.0.0.1) und einem Port (z.B. 2001) wird ein Socket erstellt. Dieser wird gebunden und das Programm geht in die while True Schleife über. Nun warted es auf eine Connection, akzeptiert diese und schickt ein HTTP 200 OK mit Hello World und schließt die connection. Dann wartet es auf eine erneute Anfrage.
Problem: Es wird erst eine Antwort geschickt, wenn ich das Python programm beende. Meine Vermutung ist, dass die Daten im Buffer des Sockets landen und deshalb erst geschickt werden, wenn der Socket geschlossen wird. Also setze ich testweise die Buffergröße auf 1 Byte:
Python:
conn.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1)
Doch das funktioniert nicht... Dann habe ich mir gedacht, ich schicke einfach leere Daten hinterher (Leerzeichen), sodass der Buffer zwangsläufig volläuft und gesendet werden muss:
Python:
conn, addr = http_s.accept()
conn.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 1024)
test123 = "HTTP/1.1 200 OK\n" + "Content-Type:text/html\n" + "Content-Length:" + str(sys.getsizeof("Hello World")) + "\n" + "\n" + "<html><body>" + "Hello World" + "</body></html>\n"
conn.send(test123.encode('UTF-8'))
test = ""
for i in range(0, 1025):
test = test + " "
sys.getsizeof(test)
conn.send(test.encode('UTF-8'))
Das ganze funktioniert manchmal, also vermutlich nur, wenn ich mit meinen Leerzeichen ufälligerweise genau die verbleibende Buffergröße treffe...
Wie mache ich das ganze richtig? Wie kann ich einfach Daten über eine TCP Verbindung schicken, wann ich will?
Vielen Dank!