[英]TCP client/server program, DataInputStream / DataOutputStream issue
[英]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.