Hallo,
Vorab: ich habe bisher noch keine Netzwerkprogrammierung gemacht, aber jetzt einiges gelesen, so auch: https://docs.python.org/2/library/socketserver.html
Das funktioniert ja, auch mit 2 Rechnern und die Übergabe der empfangen Daten vom Handler zum Hautptprogramm geht sicher auch.
Ich brauche aber etwas gringfügig anderes:
- Die meisten Beispiele, die ich gesehen habe, funktioneren so, dass der Client etwas fragt und der Server anwortet. Danach wird die Verbindung (der Socket ?) geschlossen. Innerhalb eines threads ist das dann "blocking", insgsamt (mit threads) natürlich nicht.
- Ich brauche etwas, bei dem der Client die Verbindung oeffnet, dann etwas sendet (oder auch nicht) und der Server auch sendet ohne Anfrage.
Die Verbindung soll so lange offen bleiben bis der client sie schliesst.
Irgendwo habe ich gelesen, dass die (Socket?)verbindungen immer kurz sind, weiss aber nicht, ob das notwendig oder nur üblich ist.
Geht das, was ich will, gar nicht mit Socketverbindungen und nur mit Telnet/ssh ?
Tnx für eine Antwort
Guenter
enfache Sockets
Telnet/SSH verwenden auch sockets, das ist lediglich das Protokoll! Du kannst im Grunde eine Verbindung so lange offen halten wie du willst.dk1ri hat geschrieben:Irgendwo habe ich gelesen, dass die (Socket?)verbindungen immer kurz sind, weiss aber nicht, ob das notwendig oder nur üblich ist.
Geht das, was ich will, gar nicht mit Socketverbindungen und nur mit Telnet/ssh ?
the more they change the more they stay the same
Danke für die Antwort.
Ich müsste dann also getrennte threads für schreiben und lesen auf den gleichen socket machen, und besser socket als socketserver?
Schreiben und lesen soll ja unabhaegig voneinader funktionieren.
Guenter
Ich müsste dann also getrennte threads für schreiben und lesen auf den gleichen socket machen, und besser socket als socketserver?
Schreiben und lesen soll ja unabhaegig voneinader funktionieren.
Guenter
Man sollte allerdings Bedenken dass es nicht nur eine Frage davon ist wie lange man sockets offen hält, sondern auch davon wie lange sie offen bleiben. Internetverbindungen sind vielleicht Zuhause oder im Büro noch recht stabil aber unterwegs siehts i.d.R. nicht so gut aus. Es macht also schon Sinn ein Protokoll so zu gestalten dass man mit Verbindungsabbrüchen möglichst gut klar kommt.
ssh kommt mit Verbindungsabbrüchen z.B. nicht zurecht und lässt sich deswegen in manchen Situation nicht gebrauchen.
ssh kommt mit Verbindungsabbrüchen z.B. nicht zurecht und lässt sich deswegen in manchen Situation nicht gebrauchen.
Threads kann man machen, ist aber eine unschöne und mMn sogar schwierigere Lösung, wenn du Python 3 verwendest, kannst du dir asyncio anschauen. Eine Library die unter Python 2 und 3 funktioniert ist z.B. gevent, es gibt allerdings noch mehr Frameworks wie gevent (Twisted, Tornado, greenlet, ...).dk1ri hat geschrieben:Ich müsste dann also getrennte threads für schreiben und lesen auf den gleichen socket machen, und besser socket als socketserver?
Persönlich bin ich ein großer Fan von gevent.
the more they change the more they stay the same
Die beiden Libraries kenne ich noch nicht, da bin ich erst mal etwas beschaftigt.
Ich benutze Python3, jetzt Windows, spaeter Raspberry
Das Programm, fuer das die Schnittstellen vorgesehen sind, ist ein OSI Layer 7 router mit (spaeter)schnellen und sehr langsamen Interfaces (i2C ..)
Zur Zeit polle ich im Hauptprogramm die Inputbuffer; vielleicht sind diese eventhandler ja die bessere Lösung.
Zum Testen des routing Kerns brauche ich erst mal neben Keyboard eine 2. Schnittstelle; ich dachte, mit einer einfachen Socketschnittstelle geht es am einfachsten
Ich benutze Python3, jetzt Windows, spaeter Raspberry
Das Programm, fuer das die Schnittstellen vorgesehen sind, ist ein OSI Layer 7 router mit (spaeter)schnellen und sehr langsamen Interfaces (i2C ..)
Zur Zeit polle ich im Hauptprogramm die Inputbuffer; vielleicht sind diese eventhandler ja die bessere Lösung.
Zum Testen des routing Kerns brauche ich erst mal neben Keyboard eine 2. Schnittstelle; ich dachte, mit einer einfachen Socketschnittstelle geht es am einfachsten
@David
Den Server und den passenden client habe ich jetzt mit threads hinbekommen. Fuer die Ethernetschnittstelle werde ich erst mal dabei bleiben, auch wenn die Rechnerlast höher ist als mit gevent/greenlet (wie ich gelesen habe).
Für den Parser der Inputbuffer des Routers kann greenlet aber die effektivere Lösung sein als das, was ich bisher mache. Danke für den Hinweis.
Guenter
Den Server und den passenden client habe ich jetzt mit threads hinbekommen. Fuer die Ethernetschnittstelle werde ich erst mal dabei bleiben, auch wenn die Rechnerlast höher ist als mit gevent/greenlet (wie ich gelesen habe).
Für den Parser der Inputbuffer des Routers kann greenlet aber die effektivere Lösung sein als das, was ich bisher mache. Danke für den Hinweis.
Guenter