J'aimerais écrire une petite application de serveur Bluetooth à mon téléphone Nokia à PYS60. Il doit également être en mesure d'envoyer une réponse à la demande du client et de pouvoir appuyer également les données sur le client.
Oprion 2 forte >:
L'approche Je sais qu'il existe de jolies implémentations de serveurs et d'API asynchrones aussi, mais je n'ai besoin que d'un truc vraiment basique ici. Merci d'avance! P> Voici ce que j'ai: p> Il bloque évidemment, de sorte que "certaines autres données" n'est jamais envoyée, mais c'est le meilleur J'ai jusqu'à présent. Au moins, je peux envoyer quelque chose en réponse au client. P> p> socket.recv (1024) code>, le programme attend jusqu'à ce que quelque chose soit reçu, le serveur ne peut donc pas appuyer sur les données sur le client. Le python pour la mise en oeuvre S60 manque à la méthode socket.settimeout () code>, donc je ne pouvais donc pas écrire un code non bloqué approprié. P> socket.makefile () code> était bonne, mais ne pouvait pas le faire fonctionner. Lorsque j'ai remplacé le conn.recv (1024) code> sur fd = socket.makefile () fd.readline () code>, il n'a pas lu quelque chose. P> SELECT () code>, mais n'avait pas de chance avec elle. Quand j'ai changé le conn.recv () code> vers le r, w, e = sélectionnez.select ([Conn], [], [], []) code> Comme il a été suggéré le Le client ne se connecte même pas. Il se bloque à "attendre le client ...". Etrange ... P>
3 Réponses :
Voici un exemple simple basé sur un Echo Server
#!/usr/bin/python
import socket
import select
server = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
server.bind( ('localhost', 12556) )
server.listen( 5 )
toread = [server]
running = 1
# we will shut down when all clients disconenct
while running:
rready,wready,err = select.select( toread, [], [] )
for s in rready:
if s == server:
# accepting the socket, which the OS passes off to another
# socket so we can go back to selecting. We'll append this
# new socket to the read list we select on next pass
client, address = server.accept()
toread.append( client ) # select on this socket next time
else:
# Not the server's socket, so we'll read
data = s.recv( 1024 )
if data:
print "Received %s" % ( data )
else:
print "Client disconnected"
s.close()
# remove socket so we don't watch an invalid
# descriptor, decrement client count
toread.remove( s )
running = len(toread) - 1
# clean up
server.close()
Merci, mais ce n'est pas ce dont j'ai besoin. Je dois connecter un seul client (via Bluetooth), il ne provoque donc aucun problème de bloquer la prise jusqu'à ce que le client soit connecté. Une fois la connexion initiée, le serveur doit envoyer et recevoir des données. Je ne comprends pas, pourquoi le RECV () bloque la prise de mode .SeSetBlocking (0). La sélection semble bloquer également.
Voici une implémentation du serveur d'épollal (non bloquant)
http://pastebin.com/vp6kptww (Même chose que ci-dessous, vous avez senti que cela pourrait être plus facile à copier) P>
Utiliser Testez-le en utilisant python epollserver.py code> pour démarrer le serveur. p> wget localhost: 8888 code> p>
a trouvé la solution enfin! p>
La fonction Select ne fonctionnait pas avec le module BTSocket des nouveaux ports PYS60. Quelqu'un a écrit un nouveau_btsocket (disponible ici ) avec une fonction de sélection de travail. p>