【发布时间】: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