2

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の回答を受け入れます。

4

1 に答える 1

3

コードが Android で発生していることを示す必要がありますが、UTF-16BE でデータを送信しているように見えます。Android側でエンコーディングを指定する必要があります。文字は文字通り 16 進数ではありませんが、NUL 文字は印刷できないため、\x00代わりに python が表示されます。

別のオプションは、それをデコードすることです:

self.rfile.readline().decode("utf_16_be").strip()

この結果は Unicode 文字列であることに注意してください。

于 2013-01-10T14:46:37.573 に答える