import java.net.*; import java.io.*; import java.nio.*; import java.nio.charset.*; import java.nio.channels.*; /** * Classe Server ouvrant le port de connection UDP et receptionnant le taux envoye par le client * @author Vincent Richet * * */ public class UDPServerWithChannels { //******************************************************************************************************************** // VARIABLES //******************************************************************************************************************** /** * DEFAULT_PORT correspond a la valeur par default prise par le numero de port si aucune valeur n'est mise en argument */ public final static int DEFAULT_PORT = 10000; /** * channel de connection qui sera associee a un socket pour ouvrir un port */ public static DatagramChannel channel; /** * MAX_PACKET_SIZE correspond a la taille du buffer */ public final static int MAX_PACKET_SIZE = 100; /** * byteB correspond a un ByteBuffer qui va permettre la transmission des donnees du client au server */ public static ByteBuffer byteB = ByteBuffer.allocate(MAX_PACKET_SIZE); /** * charset permet de definir le type d'endodage a realiser pour passer de string a entier */ public static final Charset charset = Charset.forName("ISO-8859-1"); //****************************************************************************************************** // METHODES //****************************************************************************************************** /** * * Permet d'associer une channel a une socket sur un port donne afin de pouvoir ecouter * * @param port_arg Le port sur lequel doit ecouter le server (si null prend la valeur 10000) * @throws IOException */ static void create_listening_server(int port_arg) throws IOException{ channel = DatagramChannel.open( ); //fin di'initialisation de la channel DatagramSocket socket = channel.socket( ); //association socket-channel //SocketAddress address = new InetSocketAddress("localhost",port); A n'utiliser qu'en local SocketAddress address = new InetSocketAddress(port_arg);//socket associee au bon port try { socket.bind(address); //essai d'ouverture du port } catch (BindException ex) { System.err.println("Erreur, port deja utilise par un autre processus"); System.exit(1); } System.out.println("Attente de reception du taux"); } /** * Permet de receptionner et decoder le buffer envoye par le client * * @param byteB_arg buffer a receptionner * @return RATE valeur envoyee par le client * @throws IOException */ static int reception_buffer(ByteBuffer byteB_arg) throws IOException{ //SocketAddress client = channel.receive(byteB_arg); // BLOQUAGE SocketAddress client = channel.receive(byteB_arg); // BLOQUAGE car channel est bloquante System.out.println("Le client est " + client); System.out.println("Reception du taux"); byteB_arg.flip( ); CharBuffer charB = charset.decode(byteB_arg); //decodage du ByteBuffer envoye par le client String CharValue = charB.toString(); //contenu du ByteBuffer mis dans un String Integer RATE_OBJET = Integer.valueOf(CharValue); //String caste en Integer int RATE = RATE_OBJET.intValue(); //Integer caste en int return(RATE); //methode renvoie la valeur envoyee par le client } //**************************************************************************************************** // MAIN //**************************************************************************************************** public static void main(String[] args) throws IOException{ int port = DEFAULT_PORT; try { port = Integer.parseInt(args[0]); } catch (Exception ex) { } create_listening_server(port); //ouvre une connexion UDP sur le port System.out.println(reception_buffer(byteB)); // renvoie la valeur envoyee par le client } //end main } //end Class