【发布时间】:2021-12-19 11:18:18
【问题描述】:
嘿,我刚开始学习 android,我的任务是制作一个从 python 服务器发送和接收数据的应用程序。它完美地发送数据,但我无法让客户端接收数据。请放轻松,我是新手,这是我的代码:
安卓代码:
class MyTask extends AsyncTask<Void, Void, Void> {
@SuppressLint(("Wrong Thread"))
@Override
protected Void doInBackground(Void... voids) {
try {
Log.d("ORI", "1- before connect");
sock = new Socket(LOCAL_HOST, PORT);
Log.d("ORI", "2 - after connect" );
prWriter = new PrintWriter(sock.getOutputStream());
prWriter.write(msg);
prWriter.flush();
BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = in.readLine()) != null) {
response.append(line);
}
Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG);
sock.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
这是我的 Python 服务器:
import socket
server_sock = socket.socket()
server_sock.bind(("0.0.0.0", 5024))
server_sock.listen(1)
client, addr = server_sock.accept()
print(addr[0])
flag = False
while True:
try:
data = client.recv(1024).decode()
except Exception as e:
print(str(e))
break
else:
if not flag:
if data == '':
pass
print(data)
try:
client.send("K".encode())
except Exception as e:
print(e)
else:
print("OK")
flag = True
server_sock.close()
【问题讨论】:
-
您没有发布任何错误或异常跟踪您的问题
-
我忘了提到它在 BufferedReader 中显示错误 = new BufferedReader(new InputStreamReader(sock.getInputStream()));它说套接字已关闭。
-
以及来自 logcat 的完整错误跟踪后的错误是什么
-
在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 在 java.util.concurrent.FutureTask.run(FutureTask.java:137) 在 android.os.AsyncTask $SerialExecutor$1.run(AsyncTask.java:230) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) at java .lang.Thread.run(Thread.java:856) 引起:libcore.io.ErrnoException:连接失败:ETIMEDOUT(连接超时)
-
您的服务器实现存在许多问题。特别是,您对 recv() 的使用非常可疑,原因有两个。 1)如果/当客户端发送超过 1K 字节时会发生什么? 2) 如果客户端发送的字节数少于 1K,但通过一次 recv() 调用并没有全部接收到,会发生什么情况?您必须有一个策略/协议,允许服务器“知道”何时收到所有数据。此外,服务器如何“知道”所有/任何客户端何时完成向其发送数据?
标签: python android server client