繁体   English   中英

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

[英]Lag between DataOutputStream and DataInputStream using an android client and python server

我的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,但似乎没有任何办法可以解决此问题。

这是因为readUTF (以及writeUTF )可能无法完成您认为的工作; DataInput文档 ,通过引用DataInputStream

首先,读取两个字节,并以与readUnsignedShort方法完全相同的方式来构造一个无符号的16位整数。 此整数值称为UTF长度,它指定要读取的其他字节数。

通常,将字符串的长度包括在字符串编码中是一个好主意。 因此,也许您应该更改python服务器代码以接收和发送长度编码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM