Java Inputstream.available()始终返回0

Java Inputstream.available()始终返回0,java,Java,我遇到了一些愚蠢的问题,我不知道我做错了什么 我编写了客户端和服务器,客户端工作正常。我检查了输出流在客户端中是否正常工作,是否有字节,但在服务器中,当客户端连接时,in.available()方法始终返回零?为什么? 我的服务器的一些代码: try{ serverSocket = new ServerSocket(port); } catch (IOException e){ System.

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

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

我的服务器的一些代码:

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

}
试试看{
serverSocket=新的serverSocket(端口);
}
捕获(IOE异常){
System.err.println(“无法侦听端口:“+端口”);
返回false;
}
System.out.println(“服务器已启动”);
setText(“服务器wystartował”);
返回true;
}
否则{
setText(“brakportu!”);
setboorder(BorderFactory.createLineBorder(Color.RED));
返回false;}
}
@凌驾
public void run(){
试一试{
clientSocket=serverSocket.accept();
data.clear();
System.out.println(“客户端连接”);
cl_obs=新客户端_obs(客户端套接字,数据);
螺纹t=新螺纹(cl_obs);
t、 start();
}
捕获(IOE异常){
System.err.println(“接受失败”);
系统出口(1);
}           
}
包服务器;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.Socket;
公共类客户端\u obs实现可运行{
私有输入流;
私人数据;
私有套接字clientSocket=null;
公共客户端(套接字cl,数据数据1){
clientSocket=cl;
数据=数据1;
}
@凌驾
公开募捐{
试一试{
in=clientSocket.getInputStream();
字节[]数据1=新字节[in.available()];;
对于(int i=0;i)

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

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

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

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

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

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


+1-值得一提的是,他说永远不要做他正在做的事情(分配一个缓冲区),因为javadocs说这可能会发生。它还明确地说不要做你正在做的事情。你可能想找到一个很好的例子,在“网络”上从Java中的套接字读取数据。