所以我在android模拟器上有一个简单的套接字服务器。当我只向它发送数据时,它工作得很好。但是如果我想将这些数据回传给python脚本,它根本不起作用。这是有效的代码:
机器人:
try {
serverSocket = new ServerSocket(port);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
while (checkingForClients) {
try {
clientSocket = serverSocket.accept();
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
line = null;
while ((line = in.readLine()) != null) {
Log.d("ServerActivity", line);
/* THIS IS THE LINE THAT DOESN'T WORK*/
//out.println(line);
handler.post(new Runnable() {
@Override
public void run() {
if(incomingData == null){
Log.e("Socket Thingey", "Null Error");
}
//out.println(line);
incomingData.setText("Testing");
incomingData.setText(line);
}
});
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
蟒:
import socket
host = 'localhost'
port = 5000
size = 1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send('Hello, World!')
# data = s.recv(size) THIS LINE CAUSES PROBLEMS
s.close()
print 'Received:' , data
所以有两条注释行。如果没有这些线条,它就能完美运作但是如果我在python中添加s.recv(size)
它就会冻结,我假设等待接收到的数据。但问题是android代码永远不会获取发送的数据。所以我不知道该怎么做。
请记住我是python和套接字的新手。
答案 0 :(得分:4)
要确保在不必关闭套接字的情况下实际发送 的所有数据,请不使用套接字的send
方法 - 请改用sendall
方法!请the docs查看sendall
...:
与send()不同,此方法仍在继续 从字符串发送数据直到 所有数据都已发送或出错 发生。
而send
的那些,就在同一页的上方,说
返回发送的字节数。 应用程序负责 检查所有数据是否已发送; 如果只有一些数据 传输,应用程序需要 尝试交付剩余的 数据
答案 1 :(得分:1)
我遇到了一些问题,你在代码中错过了socket.shutdown():
s.send('Hello, World!')
s.shutdown(1)
data = s.recv(size)
s.close()
print 'Received:' , data
你学到新东西...... 丹尼斯
答案 2 :(得分:0)
Android代码正在读取行,因此您可能需要在Python发送字符串的末尾发送\ n或可能\ r \ n。
答案 3 :(得分:0)
当我想将recv()
数据从Java转换为python时,我遇到了同样的错误。
因此,我认为python connect.send()
可以不停地等待其他进程
尝试像这样将s.shutdown(1)
放在s.send()
之后:-
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(("192.168.1.8", 2307))
sock.listen()
con, adr = sock.accept()
con.sendall(b"download test.txt")
con.shutdown(1)
print(con.recv(4096))