View Full Version : [JAVA] Socket ... ma come scrivo questi byte ?
Salve,
una volta stabilita una connessione tcp con un host remoto devo inviargli un pacchetto composto dal seguente header :
4 byte int Signature = 0xABCDEF44
4 byte int Message Type = 100
4 byte int message content length = 0
sock = new Socket("xxx.xxx.xxx.xxx",xxx);
DataOutputStream out = new DataOutputStream(sock.getOutputStream());
int[] data = new int[3] ;
data[0] = 0x7ABCDE0F;
data[1] = 100 ;
data[2] = 0;
out.writeByte(data[0]);
out.writeByte(data[1]);
out.writeByte(data[2]);
E' corretto ? mi sa di no ... l'host remoto non mi risponde correttamente ... cosa sbaglio =?
writeByte scrive un byte. Accetta un intero perchè un byte Java va da -127 a 128 e le API IO non sono esattamente il top.
Usa writeInt. Accetta un intero come writeByte ma stavolta è un intero "vero".
Alternativamente passa a NIO. Ha una classe, ByteBuffer, che rappresenta un pacchetto di byte e i canali possono spedirlo come fosse un unicum.
ByteBuffer packet = ByteBuffer.allocate(4 * 3);
packet.putInt(0xABCD);
packet.putInt(100);
packet.putInt(0);
packet.rewind();
WritableByteChannel out = Channels.newChannel(sock.getOutputStream());
while(packet.hasRemaining()) out.write(packet);
writeByte scrive un byte. Accetta un intero perchè un byte Java va da -127 a 128 e le API IO non sono esattamente il top.
Usa writeInt. Accetta un intero come writeByte ma stavolta è un intero "vero".
Alternativamente passa a NIO. Ha una classe, ByteBuffer, che rappresenta un pacchetto di byte e i canali possono spedirlo come fosse un unicum.
ByteBuffer packet = ByteBuffer.allocate(4 * 3);
packet.putInt(0xABCD);
packet.putInt(100);
packet.putInt(0);
packet.rewind();
WritableByteChannel out = Channels.newChannel(sock.getOutputStream());
while(packet.hasRemaining()) out.write(packet);
E per leggere ? Ho usato ReadableByteChannel ma mi restituisce 0 byte da leggere ... possibile ? Cioè devo attendere che i dati arrivano ? Ci sto capendo ben poco ..
A meno che il socket sia in modalità non bloccante, il tentativo di lettura per N byte dovrebbe fermare tutto fintantochè siano letti N byte, il buffer non si svuoti o il socket venga chiuso. Per dare un'idea, in lettura faresti una cosa speculare alla scrittura:
ByteBuffer incoming = ByteBuffer.allocate(4 * 3);
ReadableByteChannel in = Channels.newChannel(socket.getInputStream());
while(incoming.hasRemaining()) in.read(incoming);
incoming.flip();
int signature = in.getInt();
int type = in.getInt();
int length = in.getInt();
Se hai usato dei SocketChannel al posto dei Socket allora anzichè Channels.newChannel operi sul socket come canale ma il succo non cambia.
una volta stabilita una connessione tcp con un host remoto devo inviargli un pacchetto composto dal seguente header :Beh, intanto il server remoto cosa è??? È fatto in Java?? Se sì, usa un DataInputStream? Se no, in che formato si aspetta i dati: little-endian o big-endian??
int[] data = new int[3] ;
data[0] = 0x7ABCDE0F;
data[1] = 100 ;
data[2] = 0;
out.writeByte(data[0]);
out.writeByte(data[1]);
out.writeByte(data[2]);Comunque così non è corretto. È vero che writeByte di DataOutputStream ha come parametro un 'int' ma scrive solo 1 byte (gli 8 bit bassi).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.