2

我在 Android 应用程序和 python 服务器之间打开了一个套接字。组合是Server监听,android连接Server。

这是服务器代码。有问题的部分发生在 的定义中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应用向socket发送如下数据:

'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

将 char 作为 2 字节值写入底层输出流,先是高字节...

这两个字节代表 UTF-16 用于编码的 16 位。

当我们将其更改为一切开始工作时:

izlazdata.writeBytes(podaci);

更新

根据给出的答案,这里是如何用字符来解释不需要的字符串。

在此处输入图像描述

这解决了我的具体问题,但是,如果有人会对这里发生的事情给出一个更通用的解决方案,以便可以吸取更大的教训。如果没有,我会在几天内接受 Esailijas 的回答。

4

1 回答 1

3

您需要显示发生在 Android 上的代码,但它似乎在以 UTF-16BE 发送数据。您应该在 Android 端指定编码。这些字符不是字面上的十六进制,而是因为 NUL 字符不可打印,所以 python 显示\x00

另一种选择是对其进行解码:

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

请注意,此结果是一个 unicode 字符串。

于 2013-01-10T14:46:37.573 回答