簡體   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