Seite 1 von 1

Socket aktuelle Bufferlänge auslesen

Verfasst: Donnerstag 29. April 2010, 14:14
von Theo
Hallo zusammen,


da ich bei der Hilfe leider nix gefunden habe verfasse ich mal einen neuen Thread. Es geht darum. Ich nutze Python in einem 3D Simulator und habe vor mehrere Clients dieses Simulators miteinander kommunizieren zu lassen. Der Server ist eine C# Anwendung, welcher in einem bestimmten Zyklus schaut ob die Clients ihm etwas gesendet haben. Das klappt auch alles wie geplant.
Das Problem bereitet jetzt Python.

Code: Alles auswählen

import socket
from time import *

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 50000))

try:    
    while True:
        sleep(1)
        if s.[buffer.isEmpty()]: continue
        data = s.recv(1024)
        
finally: 
    s.close()
Ich brauche jetzt irgendwie die Möglichkeit zu schauen ob etwas auf den Buffer geschrieben wurde. Denn wenn dieser leer ist, will ich erst wieder eine Sekunde warten bevor ich dies wieder überprüfe. Das Problem ist, wenn ich im data = s.recv() drin bin, bleibt der Simulator solang stehen, bis etwas angekommen ist und nach einer Sekunde steht er wieder bis die nächste Nachricht kommt.

Ich hoffe ihr könnt mir helfen, wenn noch unklarheiten sind, versuche ich die irgendwie aus der Welt zu raeumen.

Gruss,
Theo

Verfasst: Donnerstag 29. April 2010, 14:30
von BlackJack
@Theo: Du möchtest das `socket` auf "nicht-blockierend" setzen und das `select`-Modul verwenden um festzustellen ob Daten anliegen.

Verfasst: Donnerstag 29. April 2010, 14:37
von Theo
Bitte was? Ich hab nix verstanden leider

achso und der code

Code: Alles auswählen

if s.[buffer.isEmpty()]: continue
ist in prosa geschrieben. in c# kann ich zumbeispiel die laenge des buffers mit client.Available auslesen, so weiss ich dann ob derzeit 0 zeichen oder x zeichen im buffer sind.

wenn ich

Code: Alles auswählen

s.setblocking(False)
einfuege dann bekomm ich die fehlermeldung

Traceback (most recent call last):
File "C:\Projekte\Python\client.py", line 18, in <module>
data = s.recv(1024)
socket.error: [Errno 10035] Ein nicht blockierender Socketvorgang konnte nicht sofort ausgeführt werden

Verfasst: Donnerstag 29. April 2010, 15:27
von BlackJack
@Theo: Du musst natürlich dafür sorgen, dass Du nur versuchst was auszulesen, wenn es auch wirklich etwas gibt. Dazu ist das `select`-Modul da, insbesondere die `select()`-Funktion aus dem Modul.

Ein bisschen Suchen auf der Python-Homepage hätte auch diesen Abschnitt in den HOWTOs zutage gebracht: http://docs.python.org/dev/howto/socket ... ng-sockets

Verfasst: Donnerstag 29. April 2010, 15:38
von ms4py
*Musst* du das über Raw-Socket-Kommunikation lösen? Ansonsten nimm was abstrahierendes wie XML-RPC oder SOAP.

Verfasst: Donnerstag 29. April 2010, 16:18
von Theo
@BlackJack

Die Funktion hab ich schon vor dem Post gefunden, aber leider nicht zum laufen bekommen. Ich hab jetzt eine Lösung gefunden, zwar keine schöne, aber es Funktioniert erstmal

Code: Alles auswählen

import socket
from time import *

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 50000))
s.setblocking(False) 

try:   
    while True:
        sleep(1)
        try:
            data = s.recv(1024)
        except:
            data = ""
        if data == "": continue

        ...
        ...
        ...

finally:
    s.close()
Wie gesagt nicht schoen. Wenn du mir in meinem Code zeigen kannst wie ich die select methode nutzen kann, waere ich dir sehr dankbar.

@ms4py
Von den beiden Dingen hab ich leider noch nix gehoert. Es darf auch nix all zu neues sein, da ich im Simulator nur die Version 2.2 nutzen kann :?

Danke fuer die Antworten,
Theo

Verfasst: Donnerstag 29. April 2010, 16:32
von Liffi
Theo hat geschrieben: Von den beiden Dingen hab ich leider noch nix gehoert. Es darf auch nix all zu neues sein, da ich im Simulator nur die Version 2.2 nutzen kann :?
xmlrpc ist genau seit 2.2 dabei :-).