/ / Come vengono letti la lettura e la scrittura sui socket? - java, prese

Come sono sincronizzati la lettura e la scrittura sui socket? - java, prese

Creiamo un socket. Su un lato del socket abbiamo un "server" e su un altro lato c'è un "client". Sia il server che il client possono scrivere e leggere dal socket. È quello che capisco. Non capisco le seguenti cose:

  1. Se un server legge dal socket, vede inil socket solo quelle cose che sono state scritte sul socket dal client? Voglio dire se il server scrive qualcosa sul socket e poi legge dal socket, lo vedrà (sul server) nel socket la roba che (server) ha scritto lì? Spero di no.

  2. Consideriamo la seguente situazione. Un client scrive qualcosa nel socket e quindi scrive qualcosa di nuovo nel socket e quindi il server legge dal socket. Cosa vedrà il server lì? Solo le "nuove" cose scritte dal cliente o entrambe "nuove" e "vecchie"?

  3. Se un client (o un server) scrive sul socket, può vedere se le informazioni scritte sono state ricevute dall'altro lato? Per esempio out.println("Hello, Server!") sarà di ritorno true il server ha ricevuto questo messaggio.

risposte:

4 per risposta № 1

Una connessione socket rappresenta due flussi unidirezionali: uno dal client al server e uno dal server al client.

Ogni lato può mettere i dati in un flusso e leggere dall'altro.

I dati inseriti in un flusso vengono aggiunti alla fine dei dati già presenti.

Quando i dati vengono letti da un'estremità del flusso, verranno letti i dati più vecchi disponibili (ad esempio, uno stream è un FIFO).

Queste dichiarazioni dovrebbero permetterti di rispondere a tutte le tue domande, ma lo renderò esplicito:

  1. Il server leggerà solo ciò che ha scritto il cliente e non ciò che ha scritto da solo
  2. Il server leggerà prima le vecchie cose e poi quelle nuove
  3. Il cliente non ha modo immediato di sapere se ili dati sono stati effettivamente ricevuti dall'altro lato, a meno che il server non invii qualcosa in risposta. In alcune condizioni può sapere se l'invio è fallito (ad esempio quando c'è un problema fisico sul lato del client), ma generalmente non può fare affidamento su quella notifica.

0 per risposta № 2
  1. Hai ragione, il server vedrà solo ciò che il client ha scritto sul socket

  2. Il server dovrebbe vedere sia il vecchio che il nuovo (vecchio prima e poi nuovo)

  3. Penso che questo dipenda dal tipo di socket che è. TCP sarebbe affidabile (i tuoi dati andranno dall'altra parte), mentre UDP non si preoccupa (vuoi solo i dati il ​​più velocemente possibile e la perdita è accettabile, cioè lo streaming video). Ma non sai se il messaggio è stato ricevuto a meno che non si rispedisca una risposta nella presa.


0 per risposta № 3

Gli zoccoli forniscono due "tubi" unidirezionali acomunicare con l'altra estremità: una per leggere i dati (InputStream) e l'altra per inviare i dati (OutputStream). Pertanto, non vi è alcun pericolo nella lettura nel flusso di input subito dopo aver scritto qualcosa nel flusso di output.

In secondo luogo, la scrittura di nuovi dati nell'output non sovrascrive o sostituisce il contenuto "vecchio". Il contenuto viene memorizzato nel buffer finché l'altra applicazione non lo legge.

Infine, la ricezione dei dati non viene riconosciuta dall'altra parte, ma se non si ottiene alcuna IOException dopo l'invio dei dati, si può essere certi che sia stata ricevuta dall'altra applicazione.