gpt4 book ai didi

java - 使用 android 客户端和 python 服务器在 DataOutputStream 和 DataInputStream 之间滞后

转载 作者:行者123 更新时间:2023-11-29 02:26:45 24 4
gpt4 key购买 nike

我的 android 客户端出现问题,我单击一个按钮通过套接字将数据发送到 python 服务器,该套接字对其进行处理,然后将其以大写形式发回。我的 android 客户端的数据输入流似乎总是“落后一步”:我第一次单击按钮时,python 服务器清楚地接收到它(如打印功能所示),但我的 android 中的 TextView 没有显示任何内容。当我再次点击不同的数据时,python 服务器接收到新数据,但我的 android 的 dis.readUTF() 似乎读取旧数据。

这是我的 android 客户端 onClick 函数:

public void onClick(View arg0) {

Thread t = new Thread(){

@Override
public void run() {
try {
Socket s = new Socket("192.168.4.1", 9999);
//OutputStreamWriter osw= new OutputStreamWriter(s.getOutputStream(), "UTF-8");
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
//byte[] bufO=message.getText().toString().getBytes("UTF-8");

dos.writeUTF(message.getText().toString());
DataInputStream dis = new DataInputStream(s.getInputStream());

serverResponse= dis.readUTF();
s.close();

}
catch (IOException e) {
e.printStackTrace();
}
}
};

if(message.getText().toString().equals("")){
Toast.makeText(this, "Empty command", Toast.LENGTH_SHORT).show();
}
else{
message_received.setText("");
t.start();
Toast.makeText(this, "Command sent", Toast.LENGTH_SHORT).show();
message_received.append(serverResponse + "\n");
Log.d(TAG, serverResponse);


}
}

这是我的 Python 服务器:

import socketserver
import socket

class MyHandler(socketserver.BaseRequestHandler):
def handle(self):
self.sentence= self.request.recv(1024).strip()
print(self.sentence)
self.request.sendall(self.sentence.upper())


def main():
print ("Opening socket")
host='192.168.4.1'
port=9999
server1=socketserver.TCPServer((host,port),MyHandler)
print ("Running server")
server1.serve_forever()
main()

我尝试了不同的方法,包括在 writeutf() 和 readutf() 之间添加一个 thread.sleep,但似乎没有什么可以解决这个问题。

最佳答案

这是因为 readUTF(因此 writeUTF)可能不会像您认为的那样;来自 DataInput documentation ,由 DataInputStream 引用:

First, two bytes are read and used to construct an unsigned 16-bit integer in exactly the manner of the readUnsignedShort method . This integer value is called the UTF length and specifies the number of additional bytes to be read.

一般来说,将字符串的长度包含在字符串编码中是个好主意。所以也许你应该改变 python 服务器代码来接收和发送长度编码。

关于java - 使用 android 客户端和 python 服务器在 DataOutputStream 和 DataInputStream 之间滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51838935/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com