python 从套接字接收数据
我在安卓模拟器上搭建了一个简单的套接字服务器。当我只向它发送数据时,一切都运行得很好。但是如果我想把数据回传给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();
}
Python代码:
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)
,程序就会卡住,我想它是在等待接收数据。但是问题是,安卓代码根本没有收到发送的数据。所以我不知道该怎么办。
请注意,我对Python和套接字都很陌生。
4 个回答
0
这段Android代码是在读取行,所以你可能需要在你用Python发送的字符串末尾加上一个换行符,比如\n或者\r\n。
1
我也遇到过类似的问题,你的代码里缺少了 socket.shutdown() 这个部分:
s.send('Hello, World!')
s.shutdown(1)
data = s.recv(size)
s.close()
print 'Received:' , data
你又学到新东西了……
丹尼斯
4
为了确保你的数据能够全部发送出去,而不需要关闭连接,不要使用你的套接字的 send
方法,而是要使用它的 sendall
方法!你可以查看这个文档了解 sendall
...:
与
send()
不同,这个方法会一直发送字符串中的数据,直到所有数据都发送完或者发生错误。
而在同一页面上,关于 send
的说明是:
返回发送的字节数。应用程序需要负责检查所有数据是否都已发送;如果只有部分数据被传输,应用程序需要尝试发送剩下的数据。