[转]java Socket InputStream 阻塞 问题
生活随笔
收集整理的這篇文章主要介紹了
[转]java Socket InputStream 阻塞 问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
第一次寫,不好意思,有不對(duì)地方多多指出
在Java Socket 編程中,對(duì) InputStream的read()=-1標(biāo)明流結(jié)束,一般按照
但是出現(xiàn)了一直等待現(xiàn)象,而在客戶端是本地發(fā)送測(cè)試的。。。跟蹤是在iR = is.read()時(shí)在讀完最后一個(gè)字節(jié)就阻塞了,繼續(xù)等-1的到來(lái)啊。。。。
網(wǎng)上也有很多對(duì)此的提問(wèn)。
搜索了下,發(fā)現(xiàn)這個(gè)帖子討論的比較多:
http://ansonlai.iteye.com/blog/556287
樓主帖子和回復(fù)也很有幫助。不過(guò)俺還是不滿意,繼續(xù)搜索,測(cè)試,得以發(fā)現(xiàn)原因,在那個(gè)帖子回復(fù)如下:
在我的程序中同樣出現(xiàn)了這個(gè)問(wèn)題,搜索到此。3樓的方案雖然解決了問(wèn)題,仍然沒(méi)有說(shuō)明問(wèn)題所在。用中文搜索沒(méi)找到滿意解決,只得英文搜索,搜索到:http://stackoverflow.com/questions/611760/java-inputstream-read-blocking
其中有段話有啟發(fā):It returns -1 if it's end of stream. If stream is still open (i.e. socket connection) but no data has reached the reading side (server is slow, networks is slow,...) the read() blocks.
最后發(fā)現(xiàn)其實(shí)有關(guān) read()本身沒(méi)問(wèn)題,而是client端沒(méi)有做好。
在socket.getOutputStream().write(data)后,嘗試socket.getOutputStream().close()。服務(wù)器端沒(méi)問(wèn)題了,read()會(huì)返回-1咯。。。呵呵,但是(最怕但是),客戶端close OutputStream后等帶服務(wù)器的回應(yīng)的InputSteam.read()出現(xiàn)了:socket closed Exception
最后發(fā)現(xiàn)Socket有 shutdownOutput()方法!哈哈,在客戶端write,flush后再調(diào)用shutdownOutput(),成了!后面的inputStream仍然可以。。。
當(dāng)然,如果客戶端和服務(wù)器程序是各自開發(fā),樓主及3樓的方法還是必要。
這次我碰到的問(wèn)題其實(shí)說(shuō)明這個(gè)現(xiàn)在還是普便存在的:本來(lái)用http實(shí)現(xiàn)通信的,用httpserver的httpExchange.getRequestBody()得到的InputStream處理就沒(méi)有出現(xiàn)這個(gè)問(wèn)題。后來(lái)到現(xiàn)場(chǎng)才發(fā)現(xiàn)服務(wù)器的開發(fā)單位最終是用socket實(shí)現(xiàn)的通信,還專門提出了socket的頭6個(gè)字節(jié)表示長(zhǎng)度,俺這么一寫,才發(fā)現(xiàn)對(duì)方可能也是碰到這個(gè)問(wèn)題,采取了長(zhǎng)度方法來(lái)處理。(我是在做服務(wù)器端simulator,同時(shí)也要做這個(gè)simulator的測(cè)試,所以客戶端simulator也做,沒(méi)聽糊涂吧:) )
shutdownOutput
public void shutdownOutput()
??????????????????? throws IOException
Disables the output stream for this socket. For a TCP socket, any previously written data will be sent followed by TCP's normal connection termination sequence. If you write to a socket output stream after invoking shutdownOutput() on the socket, the stream will throw an IOException.
也按照1樓同學(xué)的提示,對(duì)一個(gè)socket的先發(fā)一段,睡10秒,100秒再發(fā)后面一段,服務(wù)器都可以正常接收,客戶端也正常收到返回?cái)?shù)據(jù)
原文鏈接:http://www.iteye.com/topic/941350
轉(zhuǎn)載于:https://www.cnblogs.com/haitao-fan/archive/2013/01/18/2866994.html
總結(jié)
以上是生活随笔為你收集整理的[转]java Socket InputStream 阻塞 问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Lesson_7 上课笔记_1 ----
- 下一篇: 【自然框架之SSO】实现SSO的一个初步