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.
- android Apache httpclient archivo de carga ,. tiene algún error de reensamble TCP extraño
- Android VpnService, reenvío de paquetes
- ¿Podemos enviar datos desde un dispositivo Android a otro dispositivo android directamente (p2p) sin servidor en el medio?
- Servidor RPC basado en TCP (Erlang o algo similar?) Para la comunicación de aplicaciones iOS / Android
- No se pudo conectar a tcp: 5037: no se puede conectar a 127.0.0.1:5037: No se pudo establecer conexión porque la máquina de destino lo rechazó activamente. (10061)
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(); } } } } } }
- La mejor manera de evitar los efectos del algoritmo Nagle usando webSockets?
- ¿Por qué DefaultHttpClient envía datos a través de un socket semi-cerrado?
- ConnectionTimeout versus SocketTimeout
- Reutilizar conexiones TCP con HttpsUrlConnection
- Difusión del servidor TCP de Android
- ¿Problemas con el uso de TCP y UDP en la misma aplicación?
- No se puede conectar al servidor Openfire (mediante smack api)
- Conexión de socket TCP como servicio
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
- Calendario y recordatorio personalizados para Android
- Declare una variable global, o declare varias veces en cada clase