AndroidアプリとPythonサーバーの間にソケットを開きました。組み合わせは、サーバーがリッスンし、Androidがサーバーに接続することです。
これがサーバーコードです。問題のある部分は、次の定義で発生しhandle
ます。
import SocketServer
from time import sleep
import sys
HOST = '192.168.56.1'
PORT = 2000
class SingleTCPHandler(SocketServer.StreamRequestHandler):
def handle(self):
try:
while(1):
sleep(0.03)
data = self.rfile.readline().strip()
print data
except KeyboardInterrupt:
sys.exit(0)
class SimpleServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
allow_reuse_address = True
def __init__(self, server_address, RequestHandlerClass):
SocketServer.TCPServer.__init__(self, server_address, RequestHandlerClass)
server = SimpleServer((HOST, PORT), SingleTCPHandler)
try:
server.serve_forever()
except KeyboardInterrupt:
sys.exit(0)
接続は正常に確立され、Androidアプリは次のデータをソケットに送信します。
'0:0'
ただし、データはサーバー上で次のように受信されます。
'\x000\x00:\x000\x00'
データを受け取る変数は次のとおりです。
data = self.rfile.readline().strip()
印刷すると通常の形式になります。
In [2]: print data
0:0
print
私はそれが何をするかを見るためにpdbで関数に足を踏み入れることができませんでした。'\x000\x00:\x000\x00'
に変換する方法を探してい'0:0'
ます。
変数を変換する方法についてアドバイスしてください。実装全体にコメント/批評することを歓迎します。これはソケットを扱う私の最初のプロジェクトなので、落とし穴はわかりません。
アップデート
これは元のAndroidコードでした:
String podaci = "0:0";
public void Socketic() throws IOException {
Socket mojSocket = new Socket(urlServer, port);
DataOutputStream izlazdata = new DataOutputStream(
mojSocket.getOutputStream());
while (podaci != "end") {
try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
izlazdata.writeChars(podaci);
izlazdata.flush();
}
izlazdata.close();
mojSocket.close();
};
そして問題は、あなたが疑ったように、次のとおりでした。
izlazdata.writeChars(podaci);
writeChars
メソッドを使用しますwriteChar
。状態のAPIドキュメントwriteChar
:
基になる出力ストリームに文字を2バイト値として書き込み、上位バイトを最初に...
2バイトは、UTF-16がエンコードに使用する16ビットを表します。
すべてに変更すると、すべてが機能し始めました。
izlazdata.writeBytes(podaci);
アップデート
与えられた答えに基づいて、不要な文字列が文字の観点からどのように解釈されるかを次に示します。
これは私の具体的な問題を解決しますが、誰かがここで起こったことに対してより一般的な解決策を与えて、より大きな教訓を学ぶことができれば。そうでない場合は、数日以内にEsailijasの回答を受け入れます。