Consistenza delle stringhe quando inviati su socket

0

Sto imparando la programmazione dei socket. Ho un'applicazione Java come mio server e C # per il client. Basta inviare le linee di corda da uno all'altro. Di seguito sono presenti frammenti di codice che mostrano come lo sto attualmente facendo.

Ad ogni modo, essendo nuovo a questo, ci sono ancora due punti che mi infastidiscono:

Se si invia una stringa molto grande, è possibile che un frammento arrivi e quindi l'altro frammento. Ovviamente questo ha senso, specialmente in connessioni lente come le mie. I miei dubbi sono:

  • Supponiamo di inviare la mia stringa molto grande, che arriverà tra due tempi. Suppongo sia plausibile che la seconda metà arrivi prima della prima, per qualsiasi motivo di rete. Se questo è il caso, come si dovrebbe gestire questo?
  • Quindi la mia stringa molto grande viene inviata e blocchi di dimensioni diverse arrivano uno dopo l'altro - qual è il modo giusto per determinare che tutti questi blocchi appartengono alla stessa stringa? In altre parole, se invio "I like cats" e il target riceve "I like" e "cats" , come può dedurre che queste due cose siano destinate a far parte della stessa frase, piuttosto che a due frasi diverse? Io indovina che questo dipende interamente dai miei protocolli: forse posso inviare tag come <start> e <finish> come parte della mia frase - in questo modo il ricevitore sa che qualunque cosa si trova tra i due i tag sono una frase ... assumendo che i pezzi arrivino nell'ordine previsto (che dipende dalla mia domanda sopra).

Ricezione di una stringa

JAVA

    while (true) {
        if (socket.getInputStream().available() != 0) {
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
            System.out.println("Got message: " + input.readLine());
        }
    }

C #

    byte[] myReadBuffer = new byte[1024];
    System.Text.StringBuilder message = new System.Text.StringBuilder();
    int numberOfBytesRead = 0;
    do{
        numberOfBytesRead = stream.Read(myReadBuffer, 0, myReadBuffer.Length);
        message.AppendFormat("{0}", System.Text.Encoding.ASCII.GetString(myReadBuffer, 0, numberOfBytesRead));
    }
    while(stream.DataAvailable);

Invio di una stringa

JAVA

    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    writer.write("HELLO");

C #

    string msg = "HELLO";
    byte[] messageBytes = System.Text.Encoding.ASCII.GetBytes(msg);
    stream.Write(messageBytes,0,messageBytes.Length);
    
posta Omega 05.10.2014 - 01:38
fonte

1 risposta

3

Dato che usi gli stream, l'implementazione sottostante userà TCP che garantisce che i pacchetti arrivino in ordine alias dal la consegna dell'ordine è non il tuo problema ™. Se utilizzi UDP (datagrammi) dovrai occuparti dei pacchetti mancanti e non funzionanti, anche se non saranno diviso.

E la maggior parte dei protocolli dovrebbe avere un modo per differenziare i pacchetti (logici) successivi; ad esempio anteponendo la lunghezza del pacchetto o delimitando (postfix una sequenza speciale).

    
risposta data 05.10.2014 - 01:48
fonte

Leggi altre domande sui tag