Client Socket, dauert zu lange bis Daten empfangen werden.

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
JonnyDamnnox
User
Beiträge: 68
Registriert: Sonntag 10. März 2013, 21:14

Hallo Pythonianer !

Ich hab zwei Fragen.
1. Wieso empfange ich mit dem "Programm" keine Daten(bzw es passiert einfach nix)
2. Ist der code so richtig nach pep8 ?(vor allem was die einrückungen angeht, sieht irgendwie komplizierter aus als vorher)

Code: Alles auswählen

import socket

s = socket.socket(
     socket.AF_INET, socket.SOCK_STREAM)
	
	
print "Simple socket(client) application: "

inputhost = raw_input(
	        "Host eingeben(z.b. google.de) :\n>")
			
inputsend = raw_input(
	        "Was soll gesendet werden? :\n>")
			
s.connect((inputhost,80))
hostip = socket.gethostbyname(inputhost)


print "Connected to : {}(IP:{}) message send : {}".format(
       inputhost,
       hostip,
       inputsend)

s.sendall(inputsend)
data = s.recv(1024)

print data




(edit/ irgendwie formatiert das nicht richt, die anderen Einrückungen sollten so aussehen wie bei "Connect to....
JonnyDamnnox
User
Beiträge: 68
Registriert: Sonntag 10. März 2013, 21:14

Ahh ok ich glaub ich habs raus. Wenn man geschriebene Dateien senden will dann muss man irgendwas mit flush machen :K kann mir jemand erklären wie das funktioniert? Hab in der doc nicht viel gefunden.

Gruß
BlackJack

@JonnyDamnnox: Ad 1.: Webserver wollen gerne eine Zeile haben die auch durch ein Zeilenendezeichen abgeschlossen ist. Sonst wissen sie nicht wann die Anfrage komplett ist. Der Webserver wartet also auf das Zeilenende bevor er antwortet, während Du auf die Antwort wartest.

Ad 2.: Ich sehe nicht warum die meisten Umbrüche in den Funktionsaufrufen gemacht wurden. Einzig der `format()`-Aufruf wäre sonst zu lang für eine Zeile.

Bei `connect()` fehlt ein Leerzeichen nach dem Komma.

Ansonsten sollte man das Socket-Objekt am Ende vielleicht noch schliessen. Entweder mit dessen `close()`-Methode oder mittels ``with``-Anweisung und `contextlib.closing()`.

Code: Alles auswählen

import socket
from contextlib import closing


def main():
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
        print 'Simple socket(client) application: '
        hostname = raw_input('Host eingeben (z.B. google.de):\n>')
        request = raw_input('Was soll gesendet werden?\n>')
        sock.connect((hostname, 80))
        print 'Connected to: {0} (IP:{1}) message send: {2}'.format(
            hostname, socket.gethostbyname(hostname), request
        )
        sock.sendall(request + '\n')
        response = sock.recv(1024)
        print response


if __name__ == '__main__':
    main()
Wobei hier auch wieder die übliche Warnung gilt: *Ein* `recv()` reicht nicht garantiert aus um die gesamte Antwort zu lesen, selbst dann nicht, wenn sie kleiner als die dort angegebene Zahl von Bytes ist. Und natürlich ganz bestimmt nicht wenn die Antwort grösser als die dort angegebene Zahl ist.
JonnyDamnnox
User
Beiträge: 68
Registriert: Sonntag 10. März 2013, 21:14

Hi BlackJack !
Woah, vielen Dank für die Hilfe und Mühe :)
Unglaublich das es nur an diesem \n lag :D steht auch irgendwie nirgendwo :K ohne deine Hilfe hätte ichs wahrscheinlich nie rausgefunden.
Und du hast das jetzt in komplett einer Funktion gemacht die einfach am Ende ausgeführt wird, interessant. Sehr elegant, gewöhn ich mir am besten gleich an sowas, auch das mit contextlib mit with. Das mit recv() schau ich mir auch noch mal an.

Üprigens finde ich es toll das du hier so vielen hilfst, du scheinst auch sehr kompetent zu sein !!
Nochmal Danke dafür :wink:

Gruß
BlackJack

@JonnyDamnnox: Das mit dem Zeilenendezeichen hat ja nichts mit Sockets allgemein zu tun sondern ist Bestandteil vom Hypertext Transfer Protokoll (HTTP). Und in dessen Spezifikation steht das natürlich drin.
Antworten