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
| public class ServeurNIO {
public static void main(String[] args) {
int port = 1080;String msg = "ok mon ptit chou";
try {
//Vector list = new Vector();
// ouvrir un selecteur
Selector selecteur = Selector.open();
// ouvrir un serveur non bloquant sur le port
ServerSocketChannel server = ServerSocketChannel.open();
server.configureBlocking(false);
server.socket().bind(new InetSocketAddress(port));
server.register(selecteur, SelectionKey.OP_ACCEPT);
// definir un tampon de 1024 bytes
ByteBuffer buffer = ByteBuffer.allocate(10);
//CharBuffer b2 = buffer.asCharBuffer();
//tq il y a des elements dans le selecteur
while (selecteur.select() > 0) {
//balayer les cles du selecteur
Set<SelectionKey> selectedKeys = selecteur.selectedKeys();
Iterator<SelectionKey> i = selectedKeys.iterator();
while (i.hasNext()) {
SelectionKey key = i.next();
i.remove();
// si la cle (canal) peut etre acceptee
if (key.isAcceptable()) {
// l'accepter et redefinir l'option du canal dans le selecteur (pour lire les donnees)
SocketChannel socket = server.accept();
socket.configureBlocking(false);
socket.register(selecteur, SelectionKey.OP_READ);
}
// si la cle (canal) peut etre lue
else if (key.isReadable()) {
//récupérer le canal
SocketChannel channel = (SocketChannel) key.channel();
int len;
try {
//lire dans le canal
len = channel.read(buffer);
// s'il n'y a plus d'elements, fermer le canal et le desinscrire du selecteur
if (len <= 0) {
channel.keyFor(selecteur).cancel();
channel.close();
}
else
{
//sinon, afficher le buffer
buffer.flip();
System.out.write(buffer.array(), 0, len);
// et le transmettre a tous les clients
Set<SelectionKey> keys = selecteur.keys();
Iterator<SelectionKey> i2 = keys.iterator();
while (i2.hasNext()) {
//buffer.clear();
System.out.println("Client existant");
SelectionKey key2 = i2.next();
//verifier que la cle vient d'un client
if (key2.channel() instanceof SocketChannel) {
SocketChannel otherChannel = (SocketChannel) key2.channel();
//System.out.println("Client trouvé");
//System.out.println("Contenu du buffer:");
//affiche(buffer);
// buffer.clear();
//b2.put("toto");
//b2.flip();
// buffer.put(msg.getBytes());
buffer.flip();
buffer.rewind();
for(int z=0 ; z<10;z++)
{
buffer.put("E".getBytes());
}
buffer.rewind();
otherChannel.write(buffer);
/* if (channel.equals(otherChannel)) {
//rembobiner le buffer
buffer.rewind();
// le transmettre au client
//System.out.println("J'envois un message au client");
otherChannel.write(buffer);
}*/
}
}
buffer.clear();
System.out.println("Le buffer est vidé");
}
} catch (IOException e) {
e.printStackTrace();
try {
channel.keyFor(selecteur).cancel();
} catch (Exception e2) {
}
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
} |
Partager