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

これは完全に合法的な実装です。

この入力ストリームのメソッドの次の呼び出しによってブロックされることなく、この入力ストリームから読み取る (またはスキップする) ことができる推定バイト数を返します。次の呼び出しは、同じスレッドまたは別のスレッドである可能性があります。このバイト数の 1 回の読み取りまたはスキップはブロックされませんが、より少ないバイト数の読み取りまたはスキップが行われる可能性があります。InputStream の一部の実装はストリーム内の合計バイト数を返しますが、多くはそうではないことに注意してください。このメソッドの戻り値を使用して、このストリーム内のすべてのデータを保持するためのバッファを割り当てることは決して正しくありません

この入力ストリームが close() メソッドの呼び出しによって閉じられた場合、このメソッドのサブクラスの実装は IOException をスローすることを選択できます。

クラス InputStream の available メソッドは、常に 0 を返します。

于 2012-12-23T16:37:43.067 に答える
0

メソッドのドキュメントを参照する必要があります。available一部の実装では、利用可能な正確なバイト数を知ることができません。したがって、これらの実装では 0 が有効な結果です。

InputStream の一部の実装はストリーム内の合計バイト数を返しますが、多くはそうではないことに注意してください。このメソッドの戻り値を使用して、このストリーム内のすべてのデータを保持するためのバッファーを割り当てることは決して正しくありません。

...

クラス InputStream の available メソッドは、常に 0 を返します。

于 2012-12-23T16:41:31.760 に答える