IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Utilisation des ServerSocketChannel


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 16
    Par défaut Utilisation des ServerSocketChannel
    Bonjour tous le monde,

    Je cherche à développer une application monothread qui récupère des données reçues sur deux ports afin de les traiter.

    Je me suis donc orienté vers les ServerSocketChannel mais là je bloque.
    Je ne comprends pas pourquoi dans mon code ci-dessous le selector.select() vaut 0 alors que pourtant je lui ai associé mes 2 ServerSocketChannel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.util.Iterator;
     
    public final class ChannelManager
    {
        Selector selector = null;
        ServerSocketChannel sChannel1;
        ServerSocketChannel sChannel2;
     
        public ChannelManager() throws IOException
        {
            try
            {
                // Create the selector
                selector = Selector.open();
     
                // Create two non-blocking sockets. This method is implemented in
                // Creating a Non-Blocking Socket.
                sChannel1 = createServerSocketChannel("127.0.0.1", 31110);
                sChannel2 = createServerSocketChannel("127.0.0.1", 32110);
     
                // Register the channel with selector, listening for all events
                sChannel1.register(selector, SelectionKey.OP_ACCEPT);
                sChannel2.register(selector, SelectionKey.OP_ACCEPT);
            }
            catch (IOException e)
            {
                System.out.println("I'll be crazy "+e);
            }
     
    // Wait for events
            while (selector.select() > 0)
            {
     
                // Get list of selection keys with pending events
                Iterator it = selector.selectedKeys().iterator();
     
                // Process each key at a time
                while (it.hasNext())
                {
                    // Get the selection key
                    SelectionKey selKey = (SelectionKey) it.next();
                    // Remove it from the list to indicate that it is being processed
                    it.remove();
                    try
                    {
                        processSelectionKey(selKey);
                    }
                    catch (IOException e)
                    {
                        System.out.println("exception" + e);
                        selKey.cancel();
                    }
                }
            }
            System.out.println("END");
        }
     
        public ServerSocketChannel createServerSocketChannel(String hostName, int port) throws IOException
        {
            // Create a non-blocking server socket channel
            InetSocketAddress address = new InetSocketAddress(hostName, port);
            ServerSocketChannel sChannel = ServerSocketChannel.open();
            sChannel.configureBlocking(false);
            sChannel.socket().bind(address);
            System.out.println("Channel from: " + hostName + " port: " + port + " isOpen :"+ sChannel.isOpen());
            return sChannel;
        }
     
        public void processSelectionKey(SelectionKey selKey) throws IOException
        {
            // Since the ready operations are cumulative,
            // need to check readiness for each operation
            if (selKey.isValid() && selKey.isConnectable())
            {
                // Get channel with connection request
                SocketChannel sChannel = (SocketChannel) selKey.channel();
                System.out.println("valid et connectable:" +sChannel.toString());
                boolean success = sChannel.finishConnect();
                if (!success)
                {
                    // An error occurred; handle it
                    // Unregister the channel with this selector
                    selKey.cancel();
                }
     
            }
            if (selKey.isValid() && selKey.isReadable())
            {
                // Get channel with bytes to read
                SocketChannel sChannel = (SocketChannel) selKey.channel();
     
                if (sChannel.equals(sChannel1))
                {
                    System.out.println(" channel 1 state : " + sChannel1.isOpen());
     
                }
                else if (sChannel.equals(sChannel2))
                {
                    System.out.println("channel 2 state : " + sChannel2.isOpen());
     
                }
                else
                {
                    System.out.println("ni 1 ni 2");
                }
            }
            if (selKey.isValid() && selKey.isWritable())
            {
                // Get channel that's ready for more bytes
                SocketChannel sChannel = (SocketChannel) selKey.channel();
     
                // See Writing to a SocketChannel
            }
        }
     
        public static void main(String[] args) throws IOException
        {
            ChannelManager channel = new ChannelManager();
        }
    }
    Quelqu'un saurait-il m'indiquer comment procéder ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Il compile pas, ce code, alors c'est difficile de deviner ce qui peut mal tourner.

    Mais là, comme ça, je dirais que le principal problème est que tu fais des catch sans afficher l'exception avec printStackTrace(), donc tu as sans doute une erreur et tu ne la vois pas bien.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Règles d'utilisation des forums C
    Par Franck.H dans le forum C
    Réponses: 3
    Dernier message: 26/01/2008, 17h35
  2. [CR8.5] Utilisation des codes barre
    Par Robert dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 20/01/2005, 16h13
  3. utilisation des sockets sous windows
    Par Tupac dans le forum Réseau
    Réponses: 2
    Dernier message: 21/12/2002, 18h24
  4. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo