Implementación cliente / servidor de socket TCP de Android

Soy nuevo en Java y Android, estoy tratando de crear una aplicación cliente / servidor. Por el momento estoy ejecutando el servidor en la PC y el cliente está en un dispositivo Android. La comunicación tiene lugar y todo funciona bien, pero quiero diferenciar los mensajes entrantes del cliente con el fin de hacer diferentes acciones en el servidor. Aquí está el código para el servidor. El cliente es bastante fácil y funciona bien. Por ejemplo, cuando envío "Nombre" del cliente, el servicio debe responder con "Matteo", pero siempre responde con "Algo más" y no puedo entender por qué! Me imagino que el problema está en la sentencia if (dataInputStream.equals("Name")) {

Gracias.

 import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server1 { public static void main(String[] args){ ServerSocket serverSocket = null; Socket socket = null; DataInputStream dataInputStream = null; DataOutputStream dataOutputStream = null; try { serverSocket = new ServerSocket(8888); System.out.println("Listening on port 8888"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } while(true){ try { socket = serverSocket.accept(); dataInputStream = new DataInputStream(socket.getInputStream()); dataOutputStream = new DataOutputStream(socket.getOutputStream()); System.out.println(socket.getInetAddress() + " : " + dataInputStream.readUTF()); if (dataInputStream.equals("Name")) { dataOutputStream.writeUTF("Matteo!"); } else if (dataInputStream.equals("Surname")) { dataOutputStream.writeUTF("Rossi!"); } else { dataOutputStream.writeUTF("Something else!"); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ if( socket!= null){ try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if( dataInputStream!= null){ try { dataInputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if( dataOutputStream!= null){ try { dataOutputStream.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } } } 

DataInputStream representa el identificador de flujo de datos procedentes del socket, pero no los datos en sí. Así que .equals() compara con otro DataInputStream no con una String . Lo estás comparando directamente con una cadena, que obviamente devuelve false .

Al igual que usted está escribiendo datos con writeUTF() , necesita leer los datos de la conexión de socket a través de ese DataInputStream . Utilice uno de los métodos read() descritos aquí o si sabe que su cliente enviará líneas completas, puede envolverlo en un BufferedReader y utilizar lo siguiente:

 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(dataInputStream)); String input = bufferedReader.readLine(); if (input.equals("Name") { dataOutputStream.writeUTF("Matteo!"); } else ... 

En otra nota, en Java 7, puede usar las sentencias switch en String también, en lugar de .equals()

El truco es que debe leer algo de la DataInputStream . P.ej.

 byte[] buffer = new byte[ 1024 ]; dataInputStream.read( buffer ); if ( new String( buffer ).equals( "Name" ) ) { /* do your stuff */ } 

Esto es mucho abreviado, pero se puede trabajar desde allí.

Aclamaciones,

Tal vez mirar en un ObjectInputStream puede leer el objeto y utilizar el:

 instanceof 

palabra clave para diferenciar entre objetos

  • Escritura de audio en el servidor a través de un socket TCP
  • ¿Qué puerto debo usar para la transferencia de paquetes TCP
  • Conexiones de socket y Polling. ¿Cuál es la mejor solución en términos de duración de la batería?
  • Android cómo enviar y recibir imagen y ubicación (usando mapa) en el chat de grupo usando xmpp-smack
  • ¿Android 4.x soporta streaming RTSP sobre TCP?
  • El servidor de inicio de adb.exe falló en el estudio de android
  • Cómo iniciar servidor de adb sobre tcp mediante programación
  • Descodificación de H264 streaming usando android de bajo nivel api
  • Escribir en flujo de salida VpnService no proporciona ninguna respuesta
  • Largo tiempo de conexión TCP persistente en el Android
  • Android VpnService - ¿Cómo reenviar el tráfico interceptado de Internet?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.