0

それが私の最初の質問なので、正しく書いてください。

Java ソケットを介して byte[] 配列を送信しようとしています。その配列には画像が含まれています。

ファイルを送信するコードは次のとおりです。

public void WriteBytes(FileInputStream dis) throws IOException{
    //bufferEscritura.writeInt(dis.available()); --- readInt() doesnt work correctly
    Write(String.valueOf((int)dis.available()) + "\r\n");
    byte[] buffer = new byte[1024];
    int bytes = 0;
    while((bytes = dis.read(buffer)) != -1){
        Write(buffer, bytes);
    }
    System.out.println("Photo send!");
}
 public void Write(byte[] buffer, int bytes) throws IOException {
    bufferEscritura.write(buffer, 0, bytes);
}
public void Write(String contenido) throws IOException {
    bufferEscritura.writeBytes(contenido);
}

私のイメージ:

URL url = this.getClass().getResource("fuegos_artificiales.png");
FileInputStream dis = new FileInputStream(url.getPath());
sockManager.WriteBytes(dis);

画像ファイルを取得するための私のコード:

public byte[] ReadBytes() throws IOException{
DataInputStream dis = new DataInputStream(mySocket.getInputStream());
int size = Integer.parseInt(Read());
System.out.println("Recived size: "+ size);
byte[] buffer = new byte[size];
System.out.println("We are going to read!");
dis.readFully(buffer);
System.out.println("Photo received!");
return buffer;

}

public String Leer() throws IOException {
    return (bufferLectura.readLine());
}

画像ファイルを作成するには:

byte[] array = tcpCliente.getSocket().LeerBytes();
FileOutputStream fos = new FileOutputStream("porfavor.png");
try {
    fos.write(array);
}
finally {
    fos.close();
}

画像ファイルが作成されますが、たとえばペイントで開こうとすると、破損しているため開けないと表示されます... また、両方の画像 (元の画像と新しい画像) をメモ帳と内部には同じデータがあります。

何が起こっているのかわかりません...

あなたが私を助けてくれることを願っています。

ありがとう!

4

1 に答える 1

1
  1. ファイル長の尺度として available() を使用しないでください。そうではありません。それについては、Javadoc に特定の警告があります。

  2. DataOutputStream.writeInt() を使用して長さを書き込み、DataInputStream.readInt() を使用して読み取り、同じストリームを使用して画像データを読み取ります。同じソケットで複数のストリームを使用しないでください。

これにも:

URL url = this.getClass().getResource("fuegos_artificiales.png");
FileInputStream dis = new FileInputStream(url.getPath());

2 行目は次のようになります。

InputStream in = URL.openConnection.getInputStream();

クラス リソースはファイルではありません。

于 2012-12-16T00:42:55.707 に答える