Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android client/Java server socket; android sending but not receiving?

I've been searching for four hours and this is driving me nuts. I'm going to try keeping this short, if you need more information/code ask and I'll edit.

So I have an Android client that connects to a server using PrintWriter and BufferedReader. The way it works is it starts a new ASyncTask() to load the connection. When the connection is made, it sends a "Join" message to the server, and then loads a listen thread that has a while loop waiting for UserInput.readLine() != null, and once broken it returns a string that runs a process function that takes the string and does it's action, and reloads the listen task.

 //Listener thread
class listen extends AsyncTask<Integer, Integer, Void> {

    @Override
    protected Void doInBackground(Integer... params) {
        //Disconnect variable that's only turned true on backpress
        if (!disconnect) {
            try {
                message = Connection.listen(); //socket object
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        // async task finished
        if (!disconnect) {

            say("INCOMMING"); //easy-made function for Toast
            input(message);
        }

    }

}

and in that Connection:

public String listen() throws IOException {
    String userInput;

    while ((userInput = in.readLine()) != null) {

    }

    return userInput;
}

Now in my server java app, I have a thread that loads up other connection threads into an ArrayList and acts as a headquarters to dispatch messages to all child clients

In my connection:

            while ((inputLine = in.readLine()) != null) {   
                            //Tells HQ to process string, with id being who it's coming from
                hq.Process(id, inputLine);
                if (!connected)
                    break;
            }

in HQ object:

public void Process(int id, String str) {
     String[] msg = str.split(","); //split message
     String send = " "; //string I print to console

     if (msg[0].equals("join")) {
         send = msg[1] + " has joined!";
         parent.seats[cnew.get(id).seat] = id;
         cnew.get(id).sendData();
         System.out.println(id);
     }

And after join, the HQ tells that connection to send that player's information to the phone

   public void sendData() {
       out.println("chips," + chips); // Update chip count

               //give player his cards
       out.println("card," + hq.parent.gameCards.getCard(10) + ","
               + hq.parent.gameCards.getCard(11));

              //a cry for help to get some output on the phone
       out.println("error,SAY THIS");

      // out.flush(); //commented out because it didn't help at all

       System.out.println("sending id " + id); //debug checker (ignore this)
   }

My problem is, it worked when I connected four phones and they all sent toasts to each other. But as soon as I changed it to send back data as soon as the player joins, I'm not getting a response in Android at all.

I can't figure out why it's not working. On server side, it's going through everything (Checked with system.prints). The connection IS made, and when I click buttons on the phone the Server is outputting it's responses. But the phone is not receiving anything -- I still don't know if the server is failing to send or the phone is failing to read. Can you see anything in the code that may be causing this? Need to see more? Or have any tips on how to debug the connection status? The listen() task is never finishing it's execution anymore.

UPDATE: So I figured out it's probably to do with my while() loop on android side, doh, probably never breaking. Stupid mistake. But I tried to add this as a tester, and still nothing:

public String listen() throws IOException {
    String userInput;

    while ((userInput = in.readLine()) != null) {
        if (userInput.length() > 2)
            break;
    }

    return userInput;
}

UPDATE: Next desperate update - When I hit "back" (which sends quit msg to server that closes connection, and calls out.close and the rest.close) then I get a never ending loop of "MSG" Toast's -- The Toast that I put when an input is recognized. Is a out.close causing a block?

like image 820
Sebastian Avatar asked Nov 04 '22 16:11

Sebastian


1 Answers

So it turns out, println on the server's side wasn't printing a new line -- adding + "\n" at the end of the server's messages made it go through. Why? I don't know..

like image 50
Sebastian Avatar answered Nov 11 '22 03:11

Sebastian