Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    writeByte da Client Socket

    Buongiorno,
    Ho un problema da risolvere in ambito didattico per la soluzione di un progettino.

    Il tutto riguarda l'invio di "comandi" di un byte tra un Client e un Server via TCP. Non ho la possibilità di vedere il codice del Server quindi mi devo attenere a quanto fornito in documentazione.

    Questo è quanto è dato di sapere:

    La comunicazione è basata sullo scambio di comandi e risposte di un singolo byte; alcuni comandi considerano il byte suddiviso in campi di bit, a cui sono assegnati specifici significati; in altri casi, i byte vengono interpretati come valori numerici a 8 bit.

    I comandi hanno la seguente struttura:

    * bit 7-6: riservati per future espansioni
    * bit 5-2: opcode di comando
    * bit 1-0: codice di direzione

    Il comando che adesso mi interessa è il 9 ovvero:

    COMANDO - 9 - Registra il client sul server; questo comando deve essere inviato prima di ogni altro comando, e il byte di comando deve essere seguito da una stringa ASCII NUL-terminated.

    Ho provato in mille modi ma adesso sono fermo, non riesco ad andare avanti. Ho fatto varie ricerche sul forum ma sono un pò perplesso, ogni cosa che provo a fare non funzia.
    Riporto quanto fatto:

    codice:
    ....
    final byte REGISTER = (byte) 9;
    ....
    
    			// creo il clientSocket
    			clientSocket = new Socket(InetAddress.getByName(hServer), port); // connessione
    
    			DataOutputStream os = new DataOutputStream(clientSocket.getOutputStream());
    			
    			System.out.println("INVIO IL COMANDO 9");
    		
    			//visualizzo il 9 in binario...
    			System.out.println(Integer.toBinaryString(9));
    			
                            //scrivo il comando 9 sullo Stream
    			os.writeByte((byte) REGISTER);
    			os.writeUTF(nome+"\0");
    			os.flush(); // scarico lo stream di output
    
    			//ricevo la risposta del server...
    			DataInputStream iStream = new DataInputStream(clientSocket.getInputStream());
    questo è uno dei mille modi in cui ho provato ma ricevo sempre in risposta dal server che il
    "Comando è illegale"... .

    Credo che per questo comando non sia necessario andare a comporre gli 8 bit ( 2 + 4+ 2) ma serva soltanto inviare un byte che identifichi il valore 9 (1001). Sbaglio?

    Qualche buon'anima ha qualche dritta per uscire da questo inghippo e continuare il progettino?

    grazie ancora, shaq
    asdasdas

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: writeByte da Client Socket

    Originariamente inviato da shaq
    I comandi hanno la seguente struttura:

    * bit 7-6: riservati per future espansioni
    * bit 5-2: opcode di comando
    * bit 1-0: codice di direzione

    Il comando che adesso mi interessa è il 9 ovvero:

    COMANDO - 9 - Registra il client sul server; questo comando deve essere inviato prima di ogni altro comando, e il byte di comando deve essere seguito da una stringa ASCII NUL-terminated.
    Se, come dice il testo sopra, l'opcode di comando sta nei bit 5-2, allora il comando 9 non lo devi vedere come un byte con valore 9! Ma come un byte dove nei bit 5-2 c'è un valore 9. Vedilo come se il bit 2 fosse il bit 0 di un valore.

    00cccc00

    dove cccc sono i 4 bit del opcode (dai bit 5 a 2 compresi)

    Quindi se l'opcode è 9, allora il byte dovrà avere come valore in bit:

    00100100

    Per quanto riguarda la "direzione", non l'hai precisato ma supponiamo ora 00. E se fosse diverso .... beh, semplicemente ricalcola il tutto.

    Supponendo 00 per direzione allora il byte sopra vale 36.

    Originariamente inviato da shaq
    os.writeUTF(nome+"\0");
    Per la stringa nul-terminated, non mi pare una buona idea usare writeUTF(). Questo scrive secondo una variante del UTF-8. Ma il testo sopra dice chiaramente ASCII, non certo UTF-8 e meno ancora questa variante particolare del UTF-8 (che è spiegata dettagliatamente nella documentazione di java.io.DataInput).

    Quindi dal nome+'\0' dovresti prendere l'array di byte codificato in "US-ASCII", vedi il metodo:

    byte[] getBytes(String charsetName)

    e scrivere l'array di byte.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    grazie mille della spiegazione! ora è tutto più chiaro!

    Per la stringa e il comando ho fatto così:

    codice:
    			String s1 = nome+"\0";
    			
    			byte[] bS = s1.getBytes();
    			
    			os.writeByte((byte) 36);
    			os.write(bS);
    funzionano correttamente entrambi!

    Devo realizzare qualche metodo per la composizione dei comandi per renderlo più agile però.
    Vediamo se sono capace a fare il resto...

    Ti ringrazio moltissimo, sei stato davvero gentile e spero di non doverti più disturbare.

    shaq
    asdasdas

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da shaq
    [CODE]byte[] bS = s1.getBytes();
    Avevo detto di specificare un charset.

    getBytes("US-ASCII")

    Se non lo espliciti e usi l'altro getBytes(), quello senza argomenti, esso usa il charset di "default" della piattaforma, che in base a quale è (per una certa piattaforma/S.O.) potrebbe anche non andare bene per quello che stai facendo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.