Estoy desarrollando esta aplicación y necesito en algún momento enviar datos (dobles y cadenas en su mayoría) a un servidor. Utilizaré socket TCP y DataOutput/InputStreams. Me preguntaba cuál sería la mejor manera de hacer esto. ¿Debo tener una clase separada para manejar la conexión con los métodos de escritura/lectura implementados o tal vez simplemente definir Sockets/Streams, etc. en mi clase principal de actividad en onCreate()? ¿Es la primera manera posible? Cualquier ejemplo sería apreciado.manera correcta de usar sockets en la aplicación de Android
ps. ¿Debo usar un hilo diferente para manejar la conexión?
editar.
Así que si lo tengo derecho, esto debe ser correcta:
public class ConnectionHandler extends AsyncTask<Void, Void, Void>{
public static String serverip = "192.168.1.100";
public static int serverport = 7777;
Socket s;
public DataInputStream dis;
public DataOutputStream dos;
public int message;
@Override
protected Void doInBackground(Void... params) {
try {
Log.i("AsyncTank", "doInBackgoung: Creating Socket");
s = new Socket(serverip, serverport);
} catch (Exception e) {
Log.i("AsyncTank", "doInBackgoung: Cannot create Socket");
}
if (s.isConnected()) {
try {
dis = (DataInputStream) s.getInputStream();
dos = (DataOutputStream) s.getOutputStream();
Log.i("AsyncTank", "doInBackgoung: Socket created, Streams assigned");
} catch (IOException e) {
// TODO Auto-generated catch block
Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket not connected");
e.printStackTrace();
}
} else {
Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket is closed");
}
return null;
}
public void writeToStream(double lat, double lon) {
try {
if (s.isConnected()){
Log.i("AsynkTask", "writeToStream : Writing lat, lon");
dos.writeDouble(lat);
dos.writeDouble(lon);
} else {
Log.i("AsynkTask", "writeToStream : Cannot write to stream, Socket is closed");
}
} catch (Exception e) {
Log.i("AsynkTask", "writeToStream : Writing failed");
}
}
public int readFromStream() {
try {
if (s.isConnected()) {
Log.i("AsynkTask", "readFromStream : Reading message");
message = dis.readInt();
} else {
Log.i("AsynkTask", "readFromStream : Cannot Read, Socket is closed");
}
} catch (Exception e) {
Log.i("AsynkTask", "readFromStream : Writing failed");
}
return message;
}
}
y me gustaría utilizar algo como esto en mi clase Actividad:
ConnectionHandler conhandler = new ConnectionHandler();
conhandler.execute();
conhandler.writeToStream(lat , lon);
Ah, genial, estaba pensando más en el enhebrado tradicional, miraré más en AsyncTask y volveré si tengo alguna pregunta. Gracias. – kotsosh
También acabo de encontrar este ejemplo para cualquier persona interesada: http://stackoverflow.com/questions/5135438/example-android-bi-directional-network-socket-using-asynctask – kotsosh