2011-08-08 9 views
5

He estado buscando durante cuatro horas y esto me está volviendo loco. Voy a tratar de mantener esto corto, si necesita más información/código pregunte y voy a editar.Cliente de Android/socket de servidor Java; ¿envío de android pero no recibiendo?

Tengo un cliente de Android que se conecta a un servidor usando PrintWriter y BufferedReader. La forma en que funciona es que inicia una nueva ASyncTask() para cargar la conexión. Cuando se establece la conexión, envía un mensaje "Join" al servidor y luego carga un hilo de escucha que tiene un bucle while esperando UserInput.readLine()! = Null, y una vez quebrado, devuelve una cadena que ejecuta un proceso función que toma la cadena y lo hace, y vuelve a cargar la tarea de escucha.

//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); 
     } 

    } 

} 

y, a este respecto:

public String listen() throws IOException { 
    String userInput; 

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

    } 

    return userInput; 
} 

Ahora en mi aplicación Java del servidor, tengo un hilo que carga a otros hilos de conexión en un ArrayList y actúa como una sede para despachar mensajes a todos los niños clientes

en mi conexión:

  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; 
      } 

en el objeto HQ:

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); 
    } 

Y después de unirse, el cuartel general dice que la conexión para enviar la información de ese jugador al teléfono

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) 
    } 

Mi problema es, funcionó cuando conecto cuatro teléfonos y todos ellos envió tostadas a la otra . Pero tan pronto como lo cambié para enviar datos tan pronto como el jugador se une, no obtengo ninguna respuesta en Android.

No puedo entender por qué no está funcionando. Del lado del servidor, está pasando por todo (comprobado con system.prints). Se establece la conexión, y cuando hago clic en los botones del teléfono, el servidor está emitiendo sus respuestas. Pero el teléfono no recibe nada; todavía no sé si el servidor no puede enviar o el teléfono no lee. ¿Puedes ver algo en el código que pueda estar causando esto? ¿Necesitas ver más? ¿O tiene alguna sugerencia sobre cómo depurar el estado de la conexión? La tarea listen() nunca termina su ejecución.

ACTUALIZACIÓN: Así que me di cuenta de que es probable que tenga que ver con mi while() loop en el lado de Android, doh, probablemente nunca se rompa. Estúpido error. Pero traté de añadir esto como un probador, y todavía nada:

public String listen() throws IOException { 
    String userInput; 

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

    return userInput; 
} 

ACTUALIZACIÓN: La próxima actualización desesperada - Cuando golpeo "atrás" (que envía al servidor msg dejar de fumar que se cierra la conexión, y las llamadas out.close y el resto.close) luego obtengo un ciclo interminable de "MSG" Toast's - The Toast que pongo cuando se reconoce una entrada. ¿Un out.close está causando un bloqueo?

Respuesta

2

Resulta que println del lado del servidor no estaba imprimiendo una nueva línea, agregando + "\ n" al final de los mensajes del servidor. ¿Por qué? No sé ...

Cuestiones relacionadas