Seite 1 von 1

Python//C#--SOCKET Verbindung wird ständig unterbrochen

Verfasst: Donnerstag 1. Februar 2018, 10:42
von raspberryPiBRA
Hi Experten,


ich bin neu in die Programmierwelt eingestiegen und bin schon so weit, dass ich eine Socket-Verbindung mittels C# an einem Raspberry Pi(Python) erstellt habe.


Mit der Software wird ein Servomotor angesteuert. Nach einer weile unterbricht er jedoch die Verbindung und der Raspberry Pi sendet keine Befehle an dem Servomotor, weil ich glaube, dass die Socket Verbindung unterbrochen wurde.

Kennt jemand eine Lösung zu meinem Code?

Code: Alles auswählen

import socket
from Handler import Handler
import time
from Servo import Servo
def Server(serverSocket, port):
    handler = Handler(12, 50)        
    serverSocket.listen(1)
    i=0
    connect = 1
    try:
        while i == 0:
            clientSocket, addr = serverSocket.accept()
            i = 1
        while connect == 1: 
            data = clientSocket.recv(1024)
            request = handler.handleRequest(data)
            if not data:
                  break
            if request == "SSDN K0":        
                connect = 0
            
    except Exception as ex: 
        print(ex)
    
    Server(serverSocket, port)
    
serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
port=1234
serverSocket.bind(('192.168.0.8',port))
Server(serverSocket, port)

Re: Python//C#--SOCKET Verbindung wird ständig unterbrochen

Verfasst: Donnerstag 1. Februar 2018, 11:12
von __deets__
Dein Code ist ziemlich verworren. Rekursion (also den Wiederaufruf von "Server") als Loesung um sich neu zu verbinden ist eine schlechte Idee, denn so sammelst langsam aber sicher einen grossen Stack auf, der dann irgendwann zum Absturz fuehrt.

Deine while i Schleife ist komplett nutzlos, da sie genau ein Statement genau einmal ausfuehrt. Die Benamung entspricht nicht PEP8, was fuer uns alte Hasen verwirrend ist. Damit machst du es uns also schwerer, dir zu helfen.

Dann gibt es ein inhaerentes Problem, das du selbst ohne Verbindungsabbrueche hast: du glaubst, du bekommst immer Nachrichten mit genau einem Befehl. So funktionieren Sockets aber nicht. Die stellen einen Datenstrom dar, und Bytes kommen da in beliebigen Quantitaeten rausgetroepfelt. Das funktioniert mal gut, aber wenn du den Router tauschst oder ueber ein anderes Netzwerk arbeitst, ist ploetzlich Sense. Da muss eigentlich ein Protokoll hin.

Last but not least: du faengst eine Exception, sagst uns aber nicht, wie die aussieht. Bitte poste die.

Ich wuerde dir raten, statt roher Sockets gleich eine Abstraktionsstufe mehr einzubauen, und auf eine Middleware wie nanomsg oder zeromq zu setzen. Damit erreichst du dein Ziel schneller und robuster, inklusive automatischer wiederaufnahme der Verbindung bei Abbruch. Ich mache das fuer meinen ferngesteuerten Roboter auch: https://github.com/deets/jetbot-3000/bl ... se.py#L109

Re: Python//C#--SOCKET Verbindung wird ständig unterbrochen

Verfasst: Donnerstag 1. Februar 2018, 12:15
von raspberryPiBRA
__deets__ hat geschrieben:Dein Code ist ziemlich verworren. Rekursion (also den Wiederaufruf von "Server") als Loesung um sich neu zu verbinden ist eine schlechte Idee, denn so sammelst langsam aber sicher einen grossen Stack auf, der dann irgendwann zum Absturz fuehrt.

Deine while i Schleife ist komplett nutzlos, da sie genau ein Statement genau einmal ausfuehrt.
Vielen Dank für deine ausführliche Nachricht. Ich bin grade dabei zu lernen, wie man die Exceptions ausliest. Ich werde dir die Exceptions zusenden, sobald ich sie habe.

Hast du eine bessere Idee, wie ich die von dir angesprochenen Fehler beseitige?

Re: Python//C#--SOCKET Verbindung wird ständig unterbrochen

Verfasst: Donnerstag 1. Februar 2018, 12:27
von noisefloor
Hallo,

exakt den gleichen Thread gibt's auch im Raspi-Forum: https://forum-raspberrypi.de/forum/thre ... erbrochen/

@raspberryPiBRA: fährst du generell so einen "Hosenträger+Gürtel" Einstellung oder möchtest du einfach nur möglichst viele Leute mit deinem Problem beschäftigen?

Gruß, noisefloor

Re: Python//C#--SOCKET Verbindung wird ständig unterbrochen

Verfasst: Donnerstag 1. Februar 2018, 12:28
von raspberryPiBRA
__deets__ hat geschrieben:
Ich wuerde dir raten, statt roher Sockets gleich eine Abstraktionsstufe mehr einzubauen, und auf eine Middleware wie nanomsg oder zeromq zu setzen. Damit erreichst du dein Ziel schneller und robuster, inklusive automatischer wiederaufnahme der Verbindung bei Abbruch. Ich mache das fuer meinen ferngesteuerten Roboter auch: https://github.com/deets/jetbot-3000/bl ... se.py#L109
Ich finde diesen Abschnitt sehr interessant. Vielen Dank!