Reputation: 48577
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() {
@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.
Upvotes: 0
Views: 2198
Reputation: 300
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))
Upvotes: 0
Reputation: 177675
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.
Upvotes: 0
Reputation: 11
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
Upvotes: 1
Reputation: 881695
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.
Upvotes: 4