【问题标题】:Lag between DataOutputStream and DataInputStream using an android client and python server使用 android 客户端和 python 服务器在 DataOutputStream 和 DataInputStream 之间存在延迟
【发布时间】:2018-08-14 10:09:07
【问题描述】:

我的 android 客户端出现问题,我单击一个按钮通过套接字将数据发送到 python 服务器,该套接字对其进行处理,然后将其发送回大写。我的 android 客户端的 datainputstream 似乎总是“落后一步”:第一次单击按钮时,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,但似乎没有任何解决方法。

【问题讨论】:

  • 错误的线程处理。在 t.start() 之后不能有代码,因为它将在线程实际运行之前执行。使用 runOnUiThread() 更新文本视图。在 run() 中执行。
  • @greenapps 完全按照你说的做了,而且成功了,谢谢。

标签: java android python sockets


【解决方案1】:

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

首先,读取两个字节并使用 readUnsignedShort 方法的方式构造一个无符号的 16 位整数。这个整数值称为 UTF 长度,并指定要读取的附加字节数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2013-03-12
    • 2020-02-18
    • 2018-01-06
    • 1970-01-01
    • 2018-03-17
    • 2012-01-28
    相关资源
    最近更新 更多