Socket aktuelle Bufferlänge auslesen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Theo
User
Beiträge: 17
Registriert: Montag 24. August 2009, 16:11
Kontaktdaten:

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
BlackJack

@Theo: Du möchtest das `socket` auf "nicht-blockierend" setzen und das `select`-Modul verwenden um festzustellen ob Daten anliegen.
Theo
User
Beiträge: 17
Registriert: Montag 24. August 2009, 16:11
Kontaktdaten:

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
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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

*Musst* du das über Raw-Socket-Kommunikation lösen? Ansonsten nimm was abstrahierendes wie XML-RPC oder SOAP.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Theo
User
Beiträge: 17
Registriert: Montag 24. August 2009, 16:11
Kontaktdaten:

@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
Liffi
User
Beiträge: 153
Registriert: Montag 1. Januar 2007, 17:23

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 :-).
Antworten