Android Client/Serveur de Socket de communication à l'aide de Service ou IntentService
Jusqu'à présent j'ai été en mesure de démarrer un Serveur sur un appareil android (wifi tethering/hotspot) et laissez le Client (un autre android) se connecter et envoyer des messages sur le serveur. Ensuite, le serveur replyed. Je me rends compte que j'ai besoin d'un moyen de garder le serveur écoute de ses Clients, même si l'application de chat n'est pas en cours d'exécution. Les Clients doivent être en mesure d'envoyer le message et le serveur doit recevoir cette. Devrais-je utiliser le Service ou IntentService à obtenir ce? Je ne peux pas étendre à partir de AsyncTask & Service...comment les mettre en œuvre? Un exemple de code serait génial.
C'est comment mon Serveur ressemble:
public class Server extends AsyncTask<Integer, Void, Socket> {
private ServerSocket serverSocket;
private TextView textView;
private String incomingMsg;
private String outgoingMsg;
public Server(TextView textView) {
this.textView = textView;
}
public void closeServer() {
try {
serverSocket.close();
} catch (IOException e) {
Log.d("Server", "Closung the server caused a problem");
e.printStackTrace();
}
}
@Override
protected Socket doInBackground(Integer... params) {
try {
serverSocket = new ServerSocket(params[0]);
//accept connections
Socket socket = serverSocket.accept();
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
incomingMsg = in.readLine() + System.getProperty("line.separator");
//send a message
outgoingMsg = "You are connected to the Server" + System.getProperty("line.separator");
out.write(outgoingMsg);
out.flush();
return socket;
} catch (InterruptedIOException e) {
//if timeout occurs
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// finally {
// if (serverSocket != null) {
// try {
// serverSocket.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
return null;
}
protected void onPostExecute(Socket socket) {
if(socket != null) {
try {
Log.i("Server", "Server received: " + incomingMsg);
textView.setText("Server received: " + incomingMsg + "\n");
textView.append("Server sent: " + outgoingMsg + "\n");
Log.i("Server", "Server sent: " + outgoingMsg);
socket.close();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
} else {
Log.d("Server", "Can't communicate with the client!");
}
}
}
Et c'est mon Client:
public class Client extends AsyncTask<Integer, Void, Socket> {
private WifiManager wifi;
private Context context;
private String outMsg;
private String inMsg;
public Client(Context context, WifiManager wifiManager) {
this.context = context;
this.wifi = wifiManager;
}
@Override
protected Socket doInBackground(Integer... params) {
try {
String gateway = intToIp(wifi.getDhcpInfo().gateway);
Socket socket = new Socket(gateway, params[0]);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
String ipAdress = intToIp(wifi.getConnectionInfo().getIpAddress());
outMsg = ", Client " + ipAdress +" is connecting!" + System.getProperty("line.separator");
out.write(outMsg);
out.flush();
//accept server response
inMsg = in.readLine() + System.getProperty("line.separator");
return socket;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public String intToIp(int addr) {
return ((addr & 0xFF) + "." +
((addr >>>= 8) & 0xFF) + "." +
((addr >>>= 8) & 0xFF) + "." +
((addr >>>= 8) & 0xFF));
}
protected void onPostExecute(Socket socket) {
if(socket != null) {
Log.i("Client", "Client sent: " + outMsg);
Toast.makeText(context, "\nClient sent: " + outMsg + "\n", Toast.LENGTH_LONG).show();
Log.i("Client", "Client received: " + inMsg);
Toast.makeText(context, "Client received: " + inMsg + "\n", Toast.LENGTH_LONG).show();
} else {
Log.d("Client", "Can't connect to server!");
Toast.makeText(context, "Can't connect to server!", Toast.LENGTH_LONG).show();
}
}
}
Comment rendre un Service à partir du Serveur? Le Client devrait-il être un Service?
ok, que penser de l'utilisation du Service ou IntentService? Comment les combiner avec d'AsyncTask dans le cas d'un Service?
OriginalL'auteur user574080 | 2013-03-27
Vous devez vous connecter pour publier un commentaire.
Utiliser un service, mais oublier les AsyncTask. Votre service de démarrage de votre générique Threads (https://developer.android.com/reference/java/lang/Thread.html) et l'installation de vos prises de courant + auditeurs. Ce service permet même de gérer l'envoi de messages (via l'une des nombreuses options que couvert dans le lien ci-dessous).
Ne pas oublier de bien nettoyer les Filetages dans la onDestroy() du Service.
Notez également que si vous souhaitez que l'application de continuer à recevoir des messages à partir d'autres clients, vous aurez besoin de vous assurer que le service est forcé dans le premier plan (voir http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.La Notification). Cependant, ce n'est pas infaillible, votre service peut encore être tué.
C'est pourquoi les gens ont tendance à utiliser des serveurs hébergé sur un dédié à cocher, par opposition à chaque périphérique...
Certainement, si vous êtes en cours d'exécution de plusieurs threads, c'est une bonne idée de les gérer avec un ExecutorService. Un newFixedThreadPool peut dire que vous êtes en limitant le nombre d'utilisateurs qui peuvent se connecter, selon la façon dont vous l'architecte le serveur (ce protocole, etc?).
OriginalL'auteur kwazi