transfert d'objet, problème de Buffer
Pour une appli que je développe actuellement mais aussi pour un cours que je dois donner en fin d'année, j'ai besoin d'utiliser des sockets non bloquantes pour transférer des objets sérialisables.
je suis en train de faire des tests et je n'arrive pas à transmettre des données. J'en envoie mais je ne reçois rien.
J'envoie avec
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Socket socket = sockChan.socket();
System.out.println(socket);
OutputStream os = socket.getOutputStream();
BufferedOutputStream baos = new BufferedOutputStream(os);
System.out.println("ClientSocket, sendMessage : " + request);
byte[] T = getBytes(request);
for(int i = 0; i < T.length ; i++){
System.out.println(i +" : " + T[i]);
}
baos.write(T);
baos.flush(); |
voici la trace correspondante :
Code:
1 2 3 4 5 6 7 8 9
| ClientSocket, sendMessage : q
0 : -84
1 : -19
2 : 0
3 : 5
4 : 116
5 : 0
6 : 1
7 : 113 |
quand au serveur, lui a
Code:
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
| try {
ssChanel = ServerSocketChannel.open();
System.out.println(ssChanel.isRegistered());
serverSocket = ssChanel.socket();
Selector selector = Selector.open();
serverSocket.bind(new InetSocketAddress(5000));
System.out.println(ssChanel.isOpen());
System.out.println(ssChanel + " : Port ON");
ssChanel.configureBlocking (false);
ssChanel.register (selector, SelectionKey.OP_ACCEPT);
int rep = 0;
while(true){
System.out.println ("Attente");
int n = selector.select();
System.out.println ("selector.select() = " + n);
if (n == 0)
continue;
Iterator it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = (SelectionKey) it.next();
System.out.println ("SelectionKey = "+key);
System.out.println ("Acceptable()" + key.isAcceptable()) ;
System.out.println ("Valid()" + key.isValid());
System.out.println ("Readable()" + key.isReadable()) ;
System.out.println ("Writable()" + key.isWritable()) ;
if (key.isAcceptable()) {
System.out.println ("***Key Acceptable");
ServerSocketChannel server = (ServerSocketChannel)key.channel();
SocketChannel channel = server.accept();
System.out.println ("-- SocketChannel = "+channel);
channel.configureBlocking (false);
channel.register (selector, SelectionKey.OP_READ);
}
ByteBuffer buffer = ByteBuffer.allocateDirect (10240);
if (key.isReadable()) {
System.out.println ("***Key readable");
SocketChannel socketChannel = (SocketChannel) key.channel();
System.out.println (socketChannel);
Socket socket = socketChannel.socket();
System.out.println (socket);
buffer.clear();int count;
count = socketChannel.read (buffer);
System.out.println ("read count = "+count+ " contenu :");
byte[] T = new byte[count];
buffer.get(T);
for(int i = 0; i < T.length ; i++){
System.out.println(i +" : " + T[i]);
}
buffer.clear();
}
}
}
}
catch(Exception e){
e.printStackTrace();
} |
et la trace :
Code:
1 2 3 4 5 6 7 8 9 10
|
read count = 8 contenu :
0 : 0
1 : 0
2 : 0
3 : 0
4 : 0
5 : 0
6 : 0
7 : 0 |
A noter que le message peut changer, il trouve toujours le même nombre d'octets à l'entrée et à la sortie mais j'obtient toujours que des 0 à l'arrivée.
Qui peut m'aider ?