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?

Pas il suffit de garder le Serveur en 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