TCP Socket offen lassen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
debegr92
User
Beiträge: 2
Registriert: Freitag 27. März 2015, 19:30

Hallo zusammen,
Ich bin neu hier und habe schon ein wenig gelesen, stehe jedoch jetzt auch mal vor einem kleinen Problem.
Ich versuche mich gerade etwas an Sockets und möchte genauer gesagt Daten von mehreren Smartphones an einen Rechner schicken.
Ich habe das Beispielprogramm herangenommen, jedoch ist mir aufgefallen, dass das Programm abschmiert, wenn sich ein Smartphone trennt, da dann eben der Socket von Client geschlossen wird. Auf meiner Server Seite möchte ich jedoch den Port einfach immer offen haben und wenn Daten kommen diese Später auswerten. Wie gesagt es sollen viele Handys verbunden werden und wenn diese den Port schließen, soll der Server neu öffnen und lauschen.

Code: Alles auswählen

import socket

TCP_IP = '123.456.786.123'
TCP_PORT = 4567
BUFFER_SIZE = 20  # Normally 1024, but we want fast response

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(1)

conn, addr = s.accept()
print 'Connection address:', addr
while 1:
    data = conn.recv(BUFFER_SIZE)  # Programm stürtzt hier ab, wenn Handy sich trennt, ist ja auch klar, aber wie gehe ich da am besten vor?
    if not data: break
    print(("received data:", data))
    conn.send(data)  # echo
conn.close()
Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

@debegr92: Du solltest Dir nochmal anschauen, wie ein TCP-Server aussieht. Du läßt ja im Augenblick auch nur eine Verbindung zu und beendest dann Deine Schleife. Normalerweise arbeitet die Arbeitsschleife parallel zum einer Schleife, die die Verbindungen entgegen nimmt. Dein Programm stürzt im übrigen nicht ab, Du verläßt es ganz regulär per break.
BlackJack

@debegr92: Die `BUFFER_SIZE` und der Kommentar dazu ist merkwürdig bis falsch. Die Reaktionszeit bei 20 dürfte sich von der bei 1024 nicht wirklich unterscheiden.
debegr92
User
Beiträge: 2
Registriert: Freitag 27. März 2015, 19:30

Hallo zusammen und danke für eure Antworten.
Wie gesagt, ich versuche mich etwas darin einzuarbeiten und nehme mir das ofizielle Python Tutorial vor. Darin eben auch das Testprogramm bzw. Beispiel:
https://docs.python.org/2/library/socket.html#example

Das hier ist die Fehlermeldung, die erscheint, wenn ich die App auf meinem Handy beende. Ich glaube nicht, dass das Programm durch break "ordnungsgemäß" unterbrochen wird wie es Sirius3 sagt, da ich ja immer noch auf einen Receive warte mit einem Socket der schon lange wieder geschlossen ist:
Traceback (most recent call last):
File "test.py", line 15, in <module>
data = conn.recv(BUFFER_SIZE)
socket.error: [Errno 104] Connection reset by peer

Gerne hätte ich einfach ein Projekt wo soetwas mal an einem Beispiel gezeigt wird. Kann ja nicht so schwer sein.
Hat das jemand schonmal gemacht oder geht das so in Python garnicht?
BlackJack

@debegr92: Wenn die Gegenseite das Socket schliesst dann wird Deine Schleife ordnungsgemäss durch das ``break`` verlassen. Das ist bei Deiner Fehlermeldung aber nicht der Fall, da ist anscheinend einfach die Verbindung weggebrochen. Das ist aber kein normaler Fall sondern entweder eine Störung im Netzwerk oder eine Gegenseite die fehlerhaft programmiert ist. In dem Fall ist ja auch gar nicht sichergestellt das die Daten die man empfangen hat komplett sind und man müsste sowieso eine gesonderte Fehlerbetrachtung im Code machen. Ist bei dem Echo-Server jetzt nicht so wild ob man auch alles empfangen und zurück gesendet hat wenn die Verbindung zusammengebrochen ist, denn dann kann man da ja sowieso keine Garantien mehr geben.

Socket-Programmierung kann ja nicht so schwer sein ist eine interessante Annahme. ;-) Das richtig und robust hinzubekommen kann ganz schön ”tricky” sein und fordert mehr Aufwand und Code als die meisten annehmen wenn sie sich die API und/oder kleine Spielzeugbeispiele wie einen Echoserver anschauen.
Antworten