Gå til innhold

Objectstream - rekkefølgen på inn og ut


Anbefalte innlegg

Denne koden henger seg på linje 2:

Socket s = getSocket();
ObjectInputStream is = new ObjectInputStream(s.getInputStream());
ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());

 

Denne koden henger ikke:

Socket s = getSocket();
ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());
ObjectInputStream is = new ObjectInputStream(s.getInputStream());

 

Er det noen fornuftig forklaring på dette? Jeg har bytta plass på disse linjene flere ganger, og det samme gjentar seg hver gang. Er det noen hemmelighet jeg ikke finner dokumentasjon til, eller bare tilfeldig? (Liker ikke tilfeldigheter når jeg lager programmer)

Lenke til kommentar
Videoannonse
Annonse
Denne koden henger seg på linje 2:

Socket s = getSocket();
ObjectInputStream is = new ObjectInputStream(s.getInputStream());
ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());

 

Denne koden henger ikke:

Socket s = getSocket();
ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());
ObjectInputStream is = new ObjectInputStream(s.getInputStream());

 

Er det noen fornuftig forklaring på dette? Jeg har bytta plass på disse linjene flere ganger, og det samme gjentar seg hver gang. Er det noen hemmelighet jeg ikke finner dokumentasjon til, eller bare tilfeldig? (Liker ikke tilfeldigheter når jeg lager programmer)

5263222[/snapback]

Det skjer litt handshaking når man lager slike objektstrømmer, så Sun har valgt å gjøre dette ved at en ObjectInputStream blokkerer tråden til en tilsvarende output er opprettet og utført handshake. Hvis du lager inputstream først i begge ender vil begge vente på handshake og du havner i deadlock. Vanlig måte å gjøre dette på er:

Socket s = getSocket();
ObjectOutputStream os = new ObjectOutputStream(s.getOutputStream());
os.flush(); 
ObjectInputStream is = new ObjectInputStream(s.getInputStream());

 

os.flush(); bruker man dersom underliggende outputstream er buffret for å sikre at handshake skjer med en gang og ikke bare legges til i en skrivebuffer.

Lenke til kommentar
Det skjer litt handshaking når man lager slike objektstrømmer, så Sun har valgt å gjøre dette ved at en ObjectInputStream blokkerer tråden til en tilsvarende output er opprettet og utført handshake. Hvis du lager inputstream først i begge ender vil begge vente på handshake og du havner i deadlock.

 

Takk!

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...