簡體   English   中英

Inputstream.available() 總是返回 0

[英]Inputstream.available() always returns 0

我遇到了一些愚蠢的問題,我不知道我做錯了什么。

我寫了客戶端和服務器,客戶端工作正常。 我檢查了 output stream 在客戶端中是否正常工作有字節,但在服務器中當客戶端連接時,方法 in.avaible() 總是返回零? 為什么?

我的服務器的一些代碼:

            try{
            serverSocket = new ServerSocket(port);
        }
        catch (IOException e){
            System.err.println("Could not listen on port: " + port);
            return false;
        }
        System.out.println("Server Started");
        txtServer.setText("Server wystartował");
        return true;
        }
        else{
        txtPort.setText("Brak Portu!");
        txtPort.setBorder( BorderFactory.createLineBorder(Color.RED) );
        return false;}
    }

    @Override
    public void run() { 
        try{
            clientSocket = serverSocket.accept();
            data.clear();

            System.out.println("Client connected");
            cl_obs = new Client_obs(clientSocket, data);
            Thread t = new Thread(cl_obs);
            t.start();
        }
        catch (IOException e){
            System.err.println("Accept failed.");
            System.exit(1);
        }           


    }
          package Server;
          import java.io.IOException;
          import java.io.InputStream;
          import java.net.Socket;

          public class Client_obs implements Runnable {
      private InputStream in;
      private data data;
      private Socket clientSocket = null;
      public Client_obs(Socket cl, data data1){
        clientSocket =cl;
        data = data1;
    }
    @Override
    public void run() {
        try {
            in = clientSocket.getInputStream();
            byte[] data1 = new byte[in.available()];;           
            for (int i=0; i<data1.length; i++){
            data1[i] = (byte)in.read();
            }
            data.setData(data1);
            data.displayMSG(data.getdata());
            in.close();
            clientSocket.close();

        }
        catch(IOException e){
            e.printStackTrace();
        }
    }

}

這是完全合法的實施

返回可以從此輸入流中讀取(或跳過)的字節數的估計值,而不會被下一次調用此輸入流的方法阻塞。 下一次調用可能是同一個線程或另一個線程。 單個讀取或跳過這么多字節不會阻塞,但可以讀取或跳過更少的字節。 請注意,雖然InputStream的某些實現將返回流中的總字節數,但許多實現不會。 使用此方法的返回值來分配用於保存此流中所有數據的緩沖區絕對不正確

如果通過調用close()方法關閉此輸入流,則此方法的子類實現可以選擇拋出IOException。

類InputStream的可用方法始終返回0。

您應該查看available方法的文檔 對於某些實現,不可能知道可用的確切字節數。 因此0對於這些實現是有效的結果:

請注意,雖然InputStream的某些實現將返回流中的總字節數,但許多實現不會。 使用此方法的返回值來分配用於保存此流中所有數據的緩沖區絕對不正確。

...

類InputStream的可用方法始終返回0。

您可以使用此處提供的反射代替 available(): 確定 InputStream 的大小

ByteArrayInputStream 的簡單配方:

ByteArrayInputStream wrapper = (ByteArrayInputStream)inputStream;       
Field field = ByteArrayInputStream.class.getDeclaredField("buf");
field.setAccessible(true);
byte[] buffer = (byte[])field.get(wrapper);
return buffer.length;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM