Je développe cette application et j'ai besoin à un moment donné d'envoyer des données (doubles et chaînes pour la plupart) à un serveur. Je vais utiliser TCP socket et DataOutput/InputStreams. Je me demandais quelle serait la meilleure façon de faire cela. Dois-je avoir une classe séparée pour gérer la connexion avec les méthodes write/read implémentées ou peut-être simplement définir Sockets/Streams etc dans ma classe d'activité principale dans onCreate()? La première voie est-elle encore possible? Tous les exemples seraient appréciés.bonne façon d'utiliser les sockets dans l'application Android
ps. Dois-je utiliser un autre thread pour gérer la connexion?
modifier.
Donc, si je l'ai eu droit, cela devrait être correct:
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;
}
}
et j'utiliser quelque chose comme ça dans ma classe d'activité:
ConnectionHandler conhandler = new ConnectionHandler();
conhandler.execute();
conhandler.writeToStream(lat , lon);
Ah génial je pensais plus de filetage traditionnel, je regarderai plus dans AsyncTask et sera de retour si j'ai des questions. Merci. – kotsosh
Je viens aussi de trouver cet exemple pour toute personne intéressée: http://stackoverflow.com/questions/5135438/example-android-bi-directional-network-socket-using-asynctask – kotsosh