views:

46

answers:

1

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.

+3  A: 

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.

Alex Martelli