我在 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 的回答。