2016-03-21 12 views
0

Ich habe ein etwas ungewöhnliches Problem. Ich möchte etwas Code auf meinem Android-Smartphone über die ADB (die zusammen mit SL4A bereits eingerichtet ist) laufen und dann möchte ich es als ein Server fungieren und mit den Ergebnissen des Programms reagieren, während meine Host-Maschine als Client fungiert und diese empfängt Daten. Ich bin jedoch kein Experte für Socket-Operationen und bekomme Ergebnisse, die ich nicht verstehe. Mein Code ist wie folgt:Ausführen von Python Socket-Skript über ADB

from device import android 
import socket 

droid = android.Android() 

# Open socket 
s = socket.socket() 
HOST = socket.gethostname() 
PORT = 8000 
s.bind((HOST, PORT)) 
s.listen(5) 

print "HOST = ", HOST, ", PORT = ", PORT 

# Accept instructions 
c, addr = s.accept() 
print "Got connection from", addr 

data = "" 
while True: 
    chunk = c.recv(1024) 
    if (not chunk): 
     break 
    else: 
     data.extend(chunk) 
s.close() 

# DO STUFF WITH RECEIVED INPUT 

# Send result 
c, addr = s.accept() 
print "Got connection from", addr 
while True: 
    if (c.send(str(result)): 
     break 
s.close() 

Der Code, den ich auf dem Client laufen lasse, meine Host-Maschine ist wie folgt:

s = socket.socket() 
HOST = "localhost" 
PORT = 8000 
s.connect((HOST, PORT)) 
s.send(data) 
s.close() 

# IN A DIFFERENT FUNCTION 

s = socket.socket() 
HOST = "localhost" 
PORT = 8000 
try: 
    s.connect((HOST, PORT)) 
    results = s.recv(1024) 
    s.close() 
    return results 
except Exception: 
    return False 

Die Umwelt auf diese Weise eingerichtet wurde:

set AP_PORT=54023 
adb forward tcp:%AP_PORT% tcp:%AP_PORT% 

Also, wie soll das funktionieren: Der Server ist so eingerichtet, dass er auf meinem Android-Smartphone läuft und Eingaben akzeptiert, um das Programm auf meinem Android-Smartphone von einem anderen Programm auf meinem PC auszuführen. Nachdem das Android-Programm beendet wurde, sollte es das Ergebnis zurück an meinen PC senden.

Allerdings habe ich mehrere Probleme. Ich kann die erste Verbindung anscheinend nicht öffnen. Ich bekomme entweder 10061 oder 10049 und bin mir nicht sicher, warum das so ist. Ich habe mir die vorhandene Dokumentation angeschaut und bekomme immer noch keine Ergebnisse. Ich bin mir auch nicht sicher, ob dieser Code tatsächlich auf dem Android-Gerät ausgeführt wird, und das ist sehr wichtig für meine Anwendung, so dass ich wirklich eine Bestätigung dafür brauche.

Jede Aufklärung würde sehr geschätzt werden.

Antwort

1

Das Serverprogramm endet nie, bis es eine Ausnahme erreicht, weil Sie eine inf-Schleife einrichten: while True.
c.close() Schließen Sie die aktuelle Verbindung, dann startet die Schleife erneut und das Programm wartet auf die Annahme einer anderen Verbindung.

Das Host-Programm sollte stattdessen enden, nachdem die Nachricht gesendet wurde oder wenn eine Ausnahme erreicht wird.

Was meinst du mit: "Ich bekomme Ergebnisse, die ich nicht verstehe ... Dieser Code läuft ohne Fehler ... Das Problem, das ich habe ist, dass ich keine Ergebnisse zurück bekomme"?

Welche Ergebnisse erhalten Sie? Haben Sie die data var überprüft?

+0

Ja, das ist das Problem. Die 'Daten' var ist leer, nachdem ich empfangen habe, also bin ich mir nicht sicher, was passiert – Woody1193

+0

Ok, und c.send() welcher Wert zurück? Verwenden Sie Python 3? – JumpAlways

+0

Soweit ich in der Lage war zu sagen, ist kein Wert zurückgegeben. Ich benutze Python 2.7.6 auf meinem Host-Rechner und 2.6.2 auf Android (das entspricht Python 3). – Woody1193