Android Client-Server utilisant Sockets – Implémentation de serveur – Serveur d’impression

Dans cette série client / serveur Android utilisant Sockets post, nous allons nous concentrer sur la mise en œuvre côté serveur. Nous avons traité de la mise en œuvre côté client dans notre précédent article «Client-serveur Android utilisant des sockets – Mise en œuvre du client». Android possède un très vaste ensemble de bibliothèques permettant aux utilisateurs de mettre en œuvre des idées innovantes avec les bibliothèques fournies. Il est très facile de créer un serveur sous Android à l'aide de ces bibliothèques intégrées.

Détails d'implémentation

Dans ce tutoriel, nous utiliserons java Sockets pour réaliser notre communication serveur-client. D'un côté, il y aura un serveur qui se liera au port spécifié sur le périphérique et sera disponible pour le client en utilisant l'adresse IP et la combinaison de ports. Le client utilisera également un port aléatoire pour la connexion. Une fois la connexion établie du côté client, le serveur sera rejoué au client avec “Bonjour du serveur, vous êtes #%ré”% D sera un nombre qui augmentera avec chaque connexion.

[su_button url=”https://github.com/androidsrc/SocketServer” target=”blank” style=”stroked” background=”#51d461″ color=”#ffffff” size=”6″ center=”yes” radius=”0″ icon=”icon: arrow-circle-o-down”]Télécharger le code source complet[/su_button]

Remarque : Ce tutoriel est basé sur Android Studio 2.2, Java 1.6 et Android 6.0.

Mise en oeuvre du serveur

Implémentation de Server.java

Cette classe contient toute l'implémentation du serveur. Dans cette classe, nous allons créer un objet de "ServerSocket" dans un fil séparé. Acceptez() fonctionner dans ServerSocket attend une demande entrante et se bloque jusqu'à ce que la connexion soit ouverte. Cette méthode retourne un objet socket représentant la connexion qui vient d'être ouverte. L'adresse IP et le numéro de port du client peuvent être obtenus à partir de ce socket.

La classe privée SocketServerThread étend le thread {

int compte = 0;

@Passer outre
public void run () {
essayer 
// crée ServerSocket en utilisant le port spécifié
serverSocket = new ServerSocket (socketServerPORT);

while (true) 
// bloque l'appel jusqu'à ce que la connexion soit créée et retourne
// objet Socket
Socket socket = serverSocket.accept ();
compter ++;
message + = "#" + compte + "de"
+ socket.getInetAddress () + ":"
+ socket.getPort () + " n";

activity.runOnUiThread (new Runnable () 
@Passer outre
public void run () 
activity.msg.setText (message);

);

SocketServerReplyThread socketServerReplyThread =
new SocketServerReplyThread (socket, nombre);
socketServerReplyThread.run ();


 catch (IOException e) 
// TODO Bloc de capture généré automatiquement
e.printStackTrace ();

}
}

Ensuite, nous allons créer un objet de "SocketServerReplyThread" qui étend thread et nous passons socket et comptons au constructeur. Suivant obtenir OutputStream de Prise en utilisant getOutputStream () une fonction. UNE PrintStream est maintenant créé en utilisant OutputStream object en tant que nouveau flux d'impression ne vide pas automatiquement son contenu dans le flux cible lorsqu'une nouvelle ligne est rencontrée. Après cela nous impression() rejouer PrintStream et Courant est fermé. Huhh beaucoup de théorie.

La classe privée SocketServerReplyThread étend le thread {

Socket privé hostThreadSocket;
int cnt;

SocketServerReplyThread (Socket socket, int c) 
hostThreadSocket = socket;
cnt = c;


@Passer outre
public void run () 
OutputStream outputStream;
String msgReply = "Bonjour du serveur, vous êtes #" + cnt;

essayer 
outputStream = hostThreadSocket.getOutputStream ();
PrintStream printStream = new PrintStream (outputStream);
printStream.print (msgReply);
printStream.close ();

message + = "rejoué:" + msgReply + " n";

activity.runOnUiThread (new Runnable () 

@Passer outre
public void run () 
activity.msg.setText (message);

);

 catch (IOException e) 
// TODO Bloc de capture généré automatiquement
e.printStackTrace ();
message + = "Quelque chose ne va pas!" + e.toString () + " n";


activity.runOnUiThread (new Runnable () 

@Passer outre
public void run () 
activity.msg.setText (message);

);

}

Nous aurons enfin besoin d'une méthode pour obtenir l'adresse IP de notre serveur.

public String getIpAddress () {
String ip = "";
essayer 
Énumération enumNetworkInterfaces = NetworkInterface
.getNetworkInterfaces ();
while (enumNetworkInterfaces.hasMoreElements ()) 
NetworkInterface networkInterface = enumNetworkInterfaces
.nextElement ();
Énumération enumInetAddress = networkInterface
.getInetAddresses ();
while (enumInetAddress.hasMoreElements ()) 
InetAddress inetAddress = enumInetAddress
.nextElement ();

if (inetAddress.isSiteLocalAddress ()) 
ip + = "Serveur tournant à:"
+ inetAddress.getHostAddress ();




 catch (SocketException e) 
// TODO Bloc de capture généré automatiquement
e.printStackTrace ();
ip + = "Quelque chose ne va pas!" + e.toString () + " n";

retourne ip;
}

Implémentation complète de la classe Server.java

package com.androidsrc.server;

importer java.io.IOException;
importer java.io.OutputStream;
importer java.io.PrintStream;
importer java.net.InetAddress;
importer java.net.NetworkInterface;
importer java.net.ServerSocket;
importer java.net.Socket;
importer java.net.SocketException;
importer java.util.Enumeration;

Classe publique Server {
Activité MainActivity;
ServerSocket serverSocket;
Message de chaîne = "";
static final int socketServerPORT = 8080;

serveur public (activité MainActivity) 
this.activity = activité;
Thread socketServerThread = new Thread (nouveau SocketServerThread ());
socketServerThread.start ();


public int getPort () 
return socketServerPORT;


public void onDestroy () 
if (serverSocket! = null) 
essayer 
serverSocket.close ();
 catch (IOException e) 
// TODO Bloc de capture généré automatiquement
e.printStackTrace ();




La classe privée SocketServerThread étend le thread {

int compte = 0;

@Passer outre
public void run () {
essayer 
// crée ServerSocket en utilisant le port spécifié
serverSocket = new ServerSocket (socketServerPORT);

while (true) 
// bloque l'appel jusqu'à ce que la connexion soit créée et retourne
// objet Socket
Socket socket = serverSocket.accept ();
compter ++;
message + = "#" + compte + "de"
+ socket.getInetAddress () + ":"
+ socket.getPort () + " n";

activity.runOnUiThread (new Runnable () 
@Passer outre
public void run () 
activity.msg.setText (message);

);

SocketServerReplyThread socketServerReplyThread =
new SocketServerReplyThread (socket, nombre);
socketServerReplyThread.run ();


 catch (IOException e) 
// TODO Bloc de capture généré automatiquement
e.printStackTrace ();

}
}

La classe privée SocketServerReplyThread étend le thread {

Socket privé hostThreadSocket;
int cnt;

SocketServerReplyThread (Socket socket, int c) 
hostThreadSocket = socket;
cnt = c;


@Passer outre
public void run () 
OutputStream outputStream;
String msgReply = "Bonjour du serveur, vous êtes #" + cnt;

essayer 
outputStream = hostThreadSocket.getOutputStream ();
PrintStream printStream = new PrintStream (outputStream);
printStream.print (msgReply);
printStream.close ();

message + = "rejoué:" + msgReply + " n";

activity.runOnUiThread (new Runnable () 

@Passer outre
public void run () 
activity.msg.setText (message);

);

 catch (IOException e) 
// TODO Bloc de capture généré automatiquement
e.printStackTrace ();
message + = "Quelque chose ne va pas!" + e.toString () + " n";


activity.runOnUiThread (new Runnable () 

@Passer outre
public void run () 
activity.msg.setText (message);

);


}

public String getIpAddress () {
String ip = "";
essayer 
Énumération enumNetworkInterfaces = NetworkInterface
.getNetworkInterfaces ();
while (enumNetworkInterfaces.hasMoreElements ()) 
NetworkInterface networkInterface = enumNetworkInterfaces
.nextElement ();
Énumération enumInetAddress = networkInterface
.getInetAddresses ();
while (enumInetAddress.hasMoreElements ()) 
InetAddress inetAddress = enumInetAddress
.nextElement ();

if (inetAddress.isSiteLocalAddress ()) 
ip + = "Serveur tournant à:"
+ inetAddress.getHostAddress ();




 catch (SocketException e) 
// TODO Bloc de capture généré automatiquement
e.printStackTrace ();
ip + = "Quelque chose ne va pas!" + e.toString () + " n";

retourne ip;
}
}

Implémentation de la classe MainActivity.java

L'utilisation de la classe de serveur est très simple. Il vous suffit de créer un objet de la classe Server et de passer l'instance MainActivity au constructeur, et vous avez terminé. Voici à quoi ressemble MainActivity.java.

package com.androidsrc.server;

importer android.os.Bundle;
importer android.app.Activity;
importer android.widget.TextView;

Classe publique MainActivity étend Activity 

Serveur serveur;
TextView infoip, msg;

@Passer outre
Void protégé onCreate (Bundle savedInstanceState) 
super.onCreate (savedInstanceState);
setContentView (R.layout.activity_main);
infoip = (TextView) findViewById (R.id.infoip);
msg = (TextView) findViewById (R.id.msg);
server = new Server (this);
infoip.setText (server.getIpAddress () + ":" + server.getPort ());


@Passer outre
void protected onDestroy () 
super.onDestroy ();
server.onDestroy ();

Autres composants de support

Implémentation du fichier activity_main.xml.



    

    

    

        
    

AndroidManifest.xml

Nous aurons besoin de la permission INTERNET pour créer des sockets. N'oubliez pas d'inclure cette autorisation dans votre manifeste.




    

    

    

        

            

                

                
            
        
    


Tester l'application

Pour tester cette application, installez-la sur un appareil Android et installez le client sur un autre appareil. Les deux appareils doivent être connectés au même réseau wifi. Ajoutez maintenant une adresse IP et un port au client, puis cliquez sur Connecter. Le serveur rejouera avec un message au client. Merci

Pour toute autre question ou tutoriel personnalisé, veuillez commenter ou nous envoyer un courrier électronique à l'adresse [email protected]

Laisser un commentaire