java zásuvka / výstupní proud píše: to oni zablokovat?

hlasů
31

Pokud píši jen do zásuvky na výstupní proud, bude to někdy blokovat? Pouze čte může blokovat, že jo? Někdo mi řekl, že píše, může blokovat, ale vidím jen funkci časového limitu pro metodu čtení ze zásuvky - Socket.setSoTimeout().

To nedává smysl, aby mi, že zápis by mohl zablokovat.

Položena 27/08/2009 v 05:44
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
45

Zápis na Socket může blokovat také, a to zejména pokud se jedná o TCP Socket. OS bude vyrovnávací paměti pouze určité množství nevyslaných (nebo přenášených ale nepotvrzených) dat. Máte-li psát věci rychleji než vzdáleného aplikace je schopen číst, bude socket nakonec zálohování a vaše writevolání bude blokovat.

V reakci na tyto na případné otázky:

Takže je tam mechanismus nastavit časový limit pro to? Nejsem si jistý, jaké chování je bude muset ... možná zahodit data, pokud vyrovnávací paměti jsou plné? Případně odstranit starší data ve vyrovnávací paměti?

Neexistuje žádný mechanismus, který by nastavit časový limit pro zápis na java.net.Socket. K dispozici je Socket.setSoTimeout()metoda, ale ovlivňuje accept()i read()zavolá ... a ne write()volání. Zdá se, že se můžete dostat napsat časové limity, pokud používáte NiO-non blokování režim a volič, ale to není tak užitečné, jak si můžete představit.

Správně implementována TCP stack nebude zbavit data ve vyrovnávací paměti, pokud připojení je ukončeno. Nicméně, když se dostanete časový limit pro zápis, není jisté, zda data, která je v současné době v nárazníky OS úrovni byl přijat na druhém konci ... nebo ne. Druhým problémem je, že nevíte, kolik dat z poslední writebyl skutečně převeden do OS-level TCP stack nárazníky. Nedojde k nějaké protokol aplikační úrovni pro opakovaná synchronizace přítok * , jediný bezpečný, co dělat po vypršení časového limitu na writeje vypnout připojení.

Naproti tomu, pokud používáte UDP socket, write()volání nebude blokovat pro každou významnou dobu. Ale nevýhoda je, že v případě, že jsou problémy v síti nebo vzdálené aplikace se nedrží krok, zprávy budou spadl na zem bez oznámení obou koncích. Kromě toho můžete zjistit, že zprávy jsou někdy dodávány do vzdálené aplikace mimo provoz. Bude jen na vás (developera) se vypořádat s těmito otázkami.

* Je teoreticky možné to udělat, ale pro většinu aplikací, že nemá smysl, aby provedla další opakovaná synchronizace mechanismus na vrcholu již spolehlivé (až do bodu) TCP / IP streamu. A pokud ano smysl, měli byste také muset vypořádat s možností, že spojení uzavřeno ... tak to by bylo jednodušší předpokládat, to se zavřelo.

Odpovězeno 27/08/2009 v 06:04
zdroj uživatelem

hlasů
7

Jediným způsobem, jak toho dosáhnout, je použít Nio a selektory.

Viz writeup od inženýra Sun / Oracle v této zprávě chyb: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4031100

Odpovězeno 15/07/2011 v 16:09
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more