Networking server direkt in python starten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

hallo
ich hab einen server code in python und den zugehörigen clienten in android (java) geschrieben.
datenübertragung funktioniert.
nur echt doof, daß ich den server immer über eine .bat-datei starten muß.
ich würde gern den server code in ein anderes programm (auch python:) integrieren,
so daß ich dann das eigentliche programm mit server code direkt in python starten kann.
geht das?
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: hat Dir die Reaktion auf Deine Frage im Bereich "Netzwerkprogrammierung" nicht gefallen, oder warum stellst Du sie hier nochmal? Warum sollte das nicht gehen? Was hast Du versucht?
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

Ich habe es noch nicht ganz verstanden.
Kann ich das mit dem Threading machen?
Wenn ja:
funktioniert es, wenn ich den server code allein als thread einbinde und das hauptprogramm nicht
oder:
muß ich den pc code in einem thread starten (sozusagen als ein haupt-thread) und
den server code ebenfalls (in einem zweiten thread)?

hoffe mein problem wird so deutlich.
liebe grüße
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: ob das problemlos mit einem Thread funktioniert, kommt auf Dein Programm an. Die GUI sollte immer vom Hauptprogramm aus gestartet werden und nicht in einem Thread. Aber der Server sollte eigentlich einfach parallel dazu startbar sein:

Code: Alles auswählen

import threading

def main():
    server = threading.Thread(target=run_server)
    server.daemon = True
    server.start()
    run_gui()
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

ich hab es mal auch selbst versucht, aber...

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
from threading import Thread

class Hauptprogramm():

    def main(self):

        Thread(target = Datenerfassung().datenStart()).start()
        Thread(target = Servererfassung().serverStart()).start()

class Datenerfassung():

    def datenStart(self):
    
        print "Datenerfassung"

class Servererfassung():

    def serverStart(self):

        streamSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        get_IP = [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1]

        port = 9090
        server_address = ((ip,port))

        if len(get_IP) == 0:
            print('Kein WLAN verfuegbar!\n')
        else:

            for ip_adresse in get_IP:

                try:
                    streamSock.bind(server_address)
                    print 'Server gestartet...\nIP-Adresse: %s\n\n-(Basic)--------------------------------\n' % (ip)

                except streamSock as s_err:
                    if s_err == errno.ECONNREFUSED or s_err == errno.ECONNRESET:
                        print('Kein Internethost verfuegbar!\nServer kann nicht gestartet werden!\n')

            streamSock.listen(25)

            while True:

                client,addr = streamSock.accept()

            streamSock.close()

if __name__ == '__main__':
    Hauptprogramm = Hauptprogramm()
    Hauptprogramm.main()

wenn man das programm direkt in python startet, läuft irgendwie eine dauer streamSock.listen(25)-schleife glaub ich.
obwohl ich doch beide klassen getrennt voneinander laufen lasse!?
also meinst du, daß ich nur den server in einem thread starten muß????
Zuletzt geändert von Anonymous am Freitag 25. November 2016, 18:12, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

is ja super.
man kann also in python nicht einmal ein programm laufen lassen, das einen socket server im hintergrund startet, ohne von dem
socket.listen(3) befehl gestört zu werden?!
das ist ja schlecht!
ich glaub das geht sogar mit matlab :)
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

dies hier ist mein code zu deinem kommentar. was mach ich falsch???

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import socket
import threading
import socket

class Hauptprogramm():

    def main(self):
        daten = Datenerfassung()
        daten.datenStart()

class Zeiterfassung():

    def zeitstart(self):

        print "Zeiterfassung"


class Datenerfassung():

    def datenStart(self):

        try:
            #print a
            print "Datenerfassung"
            server = threading.Thread(target = Servererfassung().serverStart())
            server.daemon = True
            server.start()

        except:
            zeit = Zeiterfassung()
            zeit.zeitstart()
            server = threading.Thread(target = Servererfassung().serverStart())
            server.daemon = True
            server.start()

class Servererfassung():

    def serverStart(self):

        streamSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        get_IP = [ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1]

        port = 9090
        server_address = ((ip,port))

        if len(get_IP) == 0:
            print('Kein WLAN verfuegbar!\n')
        else:

            for ip_adresse in get_IP:

                try:
                    streamSock.bind(server_address)
                    print 'Server gestartet...\nIP-Adresse: %s\n\n-(Basic)--------------------------------\n' % (ip)

                except streamSock as s_err:
                    if s_err == errno.ECONNREFUSED or s_err == errno.ECONNRESET:
                        print('Kein Internethost verfuegbar!\nServer kann nicht gestartet werden!\n')

            streamSock.listen(25)

        while True:
            client,addr = streamSock.accept()
            print client,addr

        streamSock.close()

if __name__ == '__main__':

    Hauptprogramm = Hauptprogramm()
    Hauptprogramm.main()
irgendwie hat der server vorrang?!
Zuletzt geändert von Anonymous am Freitag 25. November 2016, 20:01, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du startest keinen Thread, deswegen läuft auch nichts im Hintergrund. Schau dir nochmal genau an was für ein Argument du als target an Thread() übergibst.
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

ich glaub ich übergebe eine ganze klasse an den thread, was falsch ist für meine zwecke jedenfalls.
ich hab keine ahnung... :oops:
Zuletzt geändert von DMD-OL am Samstag 26. November 2016, 14:13, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Natürlich kannst du es, du machst es aber in deinem Code nicht.
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

ich würde gern den code oben mit eigener classe als server thread laufen lassen.
wie mach ich das denn richtig?
ich glaube das ist schon etwas besser, nä?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import threading
import time

class Hauptprogramm():

    def main(self):
        daten = Datenerfassung()
        daten.datenStart()

        server = Servererfassung()
        server.serverStart()


class Zeiterfassung():

    def zeitstart(self):

        print "Zeiterfassung"

class Datenerfassung():

    def datenStart(self):

        try:
            #print a
            print "Datenerfassung"

        except:
            zeit = Zeiterfassung()
            zeit.zeitstart()


class Servererfassung():

    def serverStart(self):
        while True:
            print('Server laeuft im Hintergrund...')
            time.sleep(2)
            break

    thread = threading.Thread(target=serverStart, args=())
    thread.daemon = True
    thread.start()
    thread.join()


if __name__ == '__main__':

    Hauptprogramm = Hauptprogramm()
    Hauptprogramm.main()
Zuletzt geändert von Anonymous am Samstag 26. November 2016, 14:24, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@DMD-OL: Nein kannst Du nicht. Wenn Du es könntest würdest Du nicht fragen müssen :twisted:, und ich weiss nicht mal was das bedeuten sollte.

Das Problem hier liegt nicht an Python sondern an Dir. Python kann das was Du erreichen willst. Du musst es halt nur richtig machen. Hinweise dazu gab es schon. Du hoffst aber anscheinend auf einen Codeschnippsel damit Du es nicht selber verstehen musst. Der Inhalt der `startServer()`-Methode sagt mir das Du noch nicht soweit bist auch noch Nebenläufigkeit in Deine Programme zu bringen. Und auch Dein bisheriges Verhalten das Du ziemlich lernresistent bist. Wenn Matlab so etwas kann ohne das man verstehen muss was man da tut, dann mach es doch in Matlab. :twisted:

Edit: Nein das ist keinesfalls besser, bestätigt aber das Du nichts verstehst, sondern einfach wild herum rätst.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: ich befürchte, Du übernimmst Dich mit Deinem Vorhaben. Wenn Du den Unterschied zwischen dem, was ich geschrieben habe und was Du versuchst nicht siehst, dann ist auch nebenläufige Programmierung für Dich noch zu schwierig. Das was Du da in class-Blöcke schreibst, macht so keinen Sinn. Die Funktionen sollten alle nicht nochmal ein eine Klasse verpackt werden. Die komplette serverStart-Funktion ist ein großer Fehler. Eine Variable (get_IP) sollte nicht wie eine Funktion heißen. Variablen innerhalb von LCs sollten nicht außerhalb verwendet werden und sind ab Python 3 dort auch gar nicht mehr definiert. Eine for-Schleife über eine garantiert 1-elementige List verwirrt den Leser extrem, zumal die Laufvariable gar nicht verwendet wird. streamSock ist sicher keine Exceptiontyp und beim Aufruf von accept im Zweifel gar nicht definiert. Das streamSock.close wird nie erreicht. Es ist auch nicht Deine Aufgabe mit fragwürdigen Mitteln zu ermitteln, ob beim Starten des Servers gerade ein WLAN aktiv ist. Im Zweifel erwischst Du damit sogar irgendein internes Interface und wunderst Dich, warum keine Verbindungen möglich sind. Löscht man also den ganzen fehlerhaften unnötigen Quatsch, bleibt das hier übrig:

Code: Alles auswählen

def run_server(port=9090):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(("", port))
    sock.listen(5)
    while True:
        client, addr = sock.accept()
        print client, addr
Antworten