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?
Networking server direkt in python starten
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
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
@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()
ich hab es mal auch selbst versucht, aber...
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ß????
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()
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.
Grund: Quelltext in Codebox-Tags gesetzt.
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
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
dies hier ist mein code zu deinem kommentar. was mach ich falsch???
irgendwie hat der server vorrang?!
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()
Zuletzt geändert von Anonymous am Freitag 25. November 2016, 20:01, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
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ä?
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.
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
, 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.
Edit: Nein das ist keinesfalls besser, bestätigt aber das Du nichts verstehst, sondern einfach wild herum rätst.
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.
Edit: Nein das ist keinesfalls besser, bestätigt aber das Du nichts verstehst, sondern einfach wild herum rätst.
@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
