Come ha detto Damon Gant, TCP è un protocollo di streaming. Ti suggerisco di creare il tuo protocollo. Non vorrei inviare stringhe. Se stai facendo qualcosa di non banale, questo è davvero il modo migliore per andare.
In genere ho includono un numero magico, checksum, lunghezza del corpo del pacchetto in byte, e la versione del protocollo nei miei intestazioni del protocollo. Il numero magico facilita la delineazione dei pacchetti in un flusso (molto utile per il debug del flusso del protocollo personalizzato). Avere un checksum consente di verificare correttamente le cose. Un checksum non aiuta molto con l'integrità su TCP poiché il protocollo TCP ha già un checksum. La lunghezza del corpo del pacchetto ti aiuta a rilevare quando hai tutti i byte per il tuo pacchetto. La versione del protocollo può aiutarti a capire come interpretare i byte del corpo del pacchetto.
Dopo aver ricevuto i dati, posizionare tutti i byte in un buffer separato e cercare l'intestazione del protocollo. Se è possibile analizzare l'intestazione, verificare che i byte del pacchetto siano tutti presenti. In tal caso, analizzare il pacchetto. Ripeti questo processo finché non trovi un pacchetto incompleto o il buffer è vuoto.
Per ogni pacchetto che si desidera inviare, vorrei creare una classe. Quando si desidera inviare un pacchetto, creare e serializzare la classe appropriata e anteporre l'intestazione del protocollo per i byte di quella classe.
È possibile utilizzare il serializzatore Java, ma se molti client si connettono a un singolo server, probabilmente non si desidera utilizzare Java per il server. Ciò rende le cose difficili perché ora è necessario implementare un serializzatore java in un'altra lingua. Per questo motivo è meglio sia convertire i pacchetti in byte a mano (noiosi ma semplici) OPPURE è possibile scrivere il proprio serializzatore usando il reflection. Suggerirei quest'ultimo per progetti più grandi.
fonte
2012-10-28 19:04:07
Hai eseguito il debug per scoprire se k è> 1? –
K = 1. Se ottengo il risultato corretto, dovrebbe essere il numero di elementi presenti nell'array di byte. Ma poiché esiste un solo elemento, k = 1. – Kubik
Provare a svuotare il flusso di output dopo aver inviato i dati. –