Inputstream.available()始终返回0

时间:2012-12-23 16:32:41

标签: java

我遇到了一些愚蠢的问题,我不知道我做错了什么。

我写了客户端和服务器,客户端工作正常。我检查输出流在客户端中是否正常工作有字节,但在服务器连接客户端时,方法in.avaible()总是返回零?为什么呢?

我的服务器的SOme代码:

            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();
        }
    }

}

2 个答案:

答案 0 :(得分:9)

That's a perfectly legal implementation

  

返回此输入流可以读取(或跳过)的字节数的估计值,而不会在下次调用此输入流的方法时阻塞。下一次调用可能是同一个线程或另一个线程。单个读取或跳过这么多字节不会阻塞,但可以读取或跳过更少的字节。   请注意,虽然InputStream的某些实现将返回流中的总字节数,但许多实现不会。 使用此方法的返回值来分配用于保存此流中所有数据的缓冲区是绝对正确的。

     

如果通过调用close()方法关闭了此输入流,则此方法的子类实现可能会选择抛出IOException。

     

类InputStream的可用方法始终返回0.

答案 1 :(得分:0)

您应该查看available方法的documentation。对于某些实现,不可能知道可用的确切字节数。因此,0是这些实现的有效结果:

  

请注意,虽然InputStream的某些实现将返回流中的总字节数,但许多实现不会。使用此方法的返回值来分配用于保存此流中所有数据的缓冲区是绝对正确的。

     

...

     

类InputStream的可用方法始终返回0.