从套接字接收十六进制值而不是字符串

2024-05-18 14:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我打开了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应用程序向socket发送以下数据:

^{pr2}$

但数据在服务器上作为:

'\x000\x00:\x000\x00'

接收数据的变量是:

data = self.rfile.readline().strip()

而印刷给出了常规格式:

In [2]: print data
0:0

我没有设法进入pdb的print函数来了解它的功能。 我正在寻找一种将'\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使用方法writeCharwriteChar的API文档声明:

Writes a char to the underlying output stream as a 2-byte value, high byte first...

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

当我们把它改成一切都开始工作时:

izlazdata.writeBytes(podaci);

更新

根据给出的答案,下面是如何根据字符来解释不需要的字符串。在

enter image description here

这解决了我的具体问题,然而,如果有人能给出一个更通用的解决方案,那么我们可以学到更多的教训。 如果没有,过几天我会接受以赛利亚的回答。在


Tags: importself服务器dataserversyssleepandroid
1条回答
网友
1楼 · 发布于 2024-05-18 14:30:30

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

另一个选择是解码:

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

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

相关问题 更多 >

    热门问题