1

私はJavaが初めてなので、助けが必要です。onClick が文字列をサーバーに送信し、サーバーがソケットを使用して画像を返す必要があるアプリケーションを作成しています。したがって、私のクライアント側は Android で、サーバー側は PC - Java です。私のサーバー側は問題ないと思います (彼はすべての system.out.print コマンドを出力するため) が、クライアント側は良くありません。どこが間違っているのか教えてください。ありがとう!

これが私のサーバー(PC)側のコードです(ソケットは関数パラメーターを介して配信されます):

    try {
        dataInputStream = new DataInputStream(socket.getInputStream());
        poruka = "" + dataInputStream.readUTF();
        System.out.print(poruka);

        int bytecount = 2048;
        byte[] buf = new byte[bytecount];

        OutputStream OUT = socket.getOutputStream();
        BufferedOutputStream BuffOUT = new BufferedOutputStream(OUT, bytecount);
        FileInputStream in = new FileInputStream("screenShot.jpg");

        int i = 0;
        while ((i = in.read(buf, 0, bytecount)) != -1) {
            BuffOUT.write(buf, 0, i);
            System.out.print("check" + buf[0]);
            BuffOUT.flush();
        }


        in.close();
        BuffOUT.close();
        System.out.print("over");

    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        try {
            socket.close();
            dataInputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

ここに私のクライアント(Android)側があります:

            Socket socket = null;
            DataOutputStream dataOutputStream = null;

            try {
                socket = new Socket(IPadresa, 8888);
                dataOutputStream = new DataOutputStream(socket.getOutputStream());
                slanje = "hy string";
                dataOutputStream.writeUTF(slanje);

                FileOutputStream outToFile = new FileOutputStream("slika.jpg");

                int bytecount = 2048;
                byte[] buf = new byte[bytecount];


                InputStream IN = socket.getInputStream();
                BufferedInputStream BuffIN = new BufferedInputStream(IN, bytecount)

                int i = 0;
                int filelength = 0;       
                while((i = BuffIN.read(buf, 0, bytecount)) != -1) {
                    filelength += i;
                    outToFile.write(buf, 0, i);
                    outToFile.flush();
                }


                IN.close();
                BuffIN.close();




                dataOutputStream.close();
                socket.close();

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

詳細情報: サーバー側では、クライアントから送信された文字列を確認できます。そして、その System.out.print("over"); があります。文字列をサーバーに送信するたびにコマンドが出力されます。また、私は System.out.print("check" + buf[0]); を持っています。サーバーから何度も印刷されます。そのため、クライアント側に問題があると思います。

そして、私のクライアント側は例外をスローしません...しかし、クライアント側がwhileループを通過していないことに気付きました。そこで引っかかる。

4

1 に答える 1

0

「クライアント側が良くない」とはどういう意味かわかりませんし、完全に機能しなくなるような明らかなエラーも見当たりません。何が起こるか教えていただければ助かります。

一方、提示したコードにはいくつか問題があります。

  1. 「BuffIn」、「IN」、「IPaddresa」などの名前で業界で認められているコーディング標準に違反しています。Javaのすべての変数名は、小文字で始める必要があります。

    あなたがあなたのビジネスであるプライベートコードでこれを行う場合。ただし、Javaコードを他の人に見せようとする場合は、標準に準拠する必要があります。(そして、SOにコードを投稿すると、他の人にそれが表示されます...)

  2. 常にバッファ全体に相当するデータを読み取ろうとしているため、。に置き換えin.read(buf, 0, bytecount)in.read(buf)ください。

  3. を使用することには価値がありません。BufferedInputStreamまたは、大規模な処理や呼び出しBufferedOutputStreamのみを行う場合は価値がありません。読み取り/書き込みしているのと同じサイズのバッファを使用するようにストリームに指示すると、さらにそうなります。 readwritebyte[]

  4. クライアント側とサーバー側の両方のコードがファイル記述子をリークする可能性があります。サーバー側では、リークする可能性がありinます。クライアント側では、ストリームのファイル記述子の一部またはすべてがリークする可能性があります。

于 2013-02-16T23:14:07.630 に答える