在做任何事情之前,請允許我向你展示我的客戶端代碼:
String command;
socket.setSoTimeout(5000)。
while(true) {
try {
final byte[] targetArray = new byte[is.available() ] 。
final int x = is.read(targetArray)。
if (x == -1) {
System.out.println("end")。
break。
}
if (x == 0) continue;
command = new String(targetArray)。
handleCommand(command).start()。
}catch (Exception e){
e.printStackTrace()。
}
一旦連接到實際的套接字,客戶端發送了一些認證資料,但沒有收到任何資料,現在,它等待從服務器收到資料,當它收到時,它處理得很好,等等,除了,當我停止服務器(字面意思是關閉程式)時,什么也沒有發生,當實際上,我期望它發送EOF(-1)。相反,它只是持續地發送了0。
uj5u.com熱心網友回復:
根據available方法的檔案(強調是我):
回傳一個可以讀取的位元組數的估計值...
而且
使用這個方法的回傳值來分配一個旨在容納這個流中所有資料的緩沖區是不正確的......
所以根據你發布的最小代碼,你不應該使用available來分配緩沖區,因為它可能總是回傳0,這反過來使得read操作總是回傳0。但是根據你的問題,你只在發送程式關閉時看到這種行為,這應該意味著:
available方法正確地回傳了流中緩沖的位元組數,所以這就是你收到資料的原因。即使你消耗收到的資料的速度比發送端發送的速度快(所以一些零可能會出現在available中),你也只是continue而從不處理這種情況,這使得未來的一些其他回圈可以捕獲(最終)收到的非零長度的資料。0,因為它沒有資料。所以你分配了零長度的緩沖區,并且read方法首先檢查你的緩沖區是零長度,而不是EOF。所以要確保分配的緩沖區的大小至少為1。
另外,根據Socket#getInputStream方法的檔案:
如果套接字上沒有緩沖的位元組,并且套接字還沒有使用
close關閉,那么available將回傳0。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/311826.html
標籤:
