|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
[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 =? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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);
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jul 2002
Città: Napoli
Messaggi: 1964
|
Quote:
|
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
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.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Comunque così non è corretto. È vero che writeByte di DataOutputStream ha come parametro un 'int' ma scrive solo 1 byte (gli 8 bit bassi).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:26.