2010-07-27 4 views
0

J'ai donc un simple serveur socket sur un émulateur android. Lorsque je n'envoie que des données, cela fonctionne très bien. Mais si je veux renvoyer ces données au script python, cela ne fonctionne pas du tout. Voici le code qui fonctionne:Réception python à partir d'une socket

android:

 


try { 
       serverSocket = new ServerSocket(port); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 


      while (checkingForClients) { 

       try { 
        clientSocket = serverSocket.accept(); 

        out = new PrintWriter(clientSocket.getOutputStream(), true); 
        in = new BufferedReader(new InputStreamReader(
          clientSocket.getInputStream())); 

        line = null; 
        while ((line = in.readLine()) != null) { 
         Log.d("ServerActivity", line); 

         /* THIS IS THE LINE THAT DOESN'T WORK*/ 
         //out.println(line); 
         handler.post(new Runnable() { 
          @Override 
          public void run() { 

           if(incomingData == null){ 
            Log.e("Socket Thingey", "Null Error"); 
           } 
           //out.println(line); 

           incomingData.setText("Testing"); 

           incomingData.setText(line); 


          } 
         }); 

        } 

       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

 

python:

 


import socket 

host = 'localhost' 
port = 5000 
size = 1024 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((host,port)) 
s.send('Hello, World!') 
# data = s.recv(size) THIS LINE CAUSES PROBLEMS 
s.close() 
print 'Received:' , data 

 

Donc, il y a deux lignes de commentaires. Sans ces lignes, cela fonctionne parfaitement. Mais si j'ajoute s.recv(size) en python, il se fige et j'attends les données reçues. Mais le problème est que le code android n'obtient jamais les données envoyées. Donc je n'ai aucune idée de ce qu'il faut faire. Gardez à l'esprit que je suis nouveau sur python et sur les sockets.

Répondre

4

Pour vous assurer que toutes vos données réellement -t obtenir envoyé sans avoir à fermer la prise, ne pas utiliser la méthode send de votre prise - utiliser sa méthode sendall à la place! Regardez the docs pour sendall ...:

Contrairement send(), cette méthode continue pour envoyer des données de la chaîne jusqu'à ce que soit toutes les données ont été envoyées ou une erreur se produit.

tandis que ceux pour send, juste au-dessus dans la même page, disent

Renvoie le nombre d'octets envoyés. Les applications sont responsables de en vérifiant que toutes les données ont été envoyées; si seulement certaines des données ont été transmises , l'application doit tenter de remettre les données restantes.

1

J'ai eu l'un problème, vous avez manqué socket.shutdown() dans votre code:

s.send('Hello, World!') 
s.shutdown(1) 
data = s.recv(size) 
s.close() 
print 'Received:' , data 

On en apprend ... Dennis

0

Le code Android est en train de lire les lignes, vous avez donc probablement besoin d'envoyer \ n ou éventuellement \ r \ n à la fin de votre chaîne d'envoi Python.

Questions connexes