python receiving from a socket
So I have a simple socket server on an android emulator. When I'm only sending data to it, it works just fine. But then if I want to echo that data back to the python script, it doesn't work at all. Here's the code that works:
android:
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() {
开发者_如何学JAVA @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
So there are 2 commented lines. Without those lines, it works perfectly. But if I add in s.recv(size)
in python it just freezes and I assume waits for the received data. But the problem is that the android code never gets the sent data. So I have no idea what to do.
Keep in mind I'm new to python and to sockets.
To ensure that all of your data actually does get sent without having to close the socket, do not use the send
method of your socket -- use its sendall
method instead! Look at the docs for sendall
...:
Unlike send(), this method continues to send data from string until either all data has been sent or an error occurs.
while those for send
, just above in the same page, say
Returns the number of bytes sent. Applications are responsible for checking that all data has been sent; if only some of the data was transmitted, the application needs to attempt delivery of the remaining data.
I had the some problem, you missed socket.shutdown() in your code:
s.send('Hello, World!')
s.shutdown(1)
data = s.recv(size)
s.close()
print 'Received:' , data
You Learn Something New... Dennis
The Android code is reading lines, so you need probably to send a \n or possibly \r\n at the end of your Python send string.
I had the same error bro, when i wanted to recv()
data from java to python.
So, I thought that python connect.send()
worked with no stop to wait the other processess
try to put s.shutdown(1)
after s.send()
like this:-
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))
精彩评论