3

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

我写了客户端和服务器,客户端工作正常。我检查了输出流在客户端中是否正常工作,有字节,但是在服务器中,当客户端连接时,方法 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();
        }
    }

}
4

2 回答 2

9

这是一个完全合法的实施

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

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

InputStream 类的可用方法总是返回 0。

于 2012-12-23T16:37:43.067 回答
0

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

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

...

InputStream 类的可用方法总是返回 0。

于 2012-12-23T16:41:31.760 回答