Java套接字,获取图像文件,但它没有打开

时间:2012-12-15 14:33:16

标签: java sockets

这是我的第一个问题,所以我希望我写得正确。

我试图通过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();
}

创建了图像文件,但是当我尝试打开它时,例如使用Paint它说它无法打开它,因为它已损坏... 我还尝试用记事本打开两个图像(原始图像和新图像),它们内部有相同的数据!

我不知道发生了什么......

我希望你帮助我。

谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 不要使用available()作为文件长度的度量。事实并非如此。 Javadoc中有一个特定的警告。

  2. 使用DataOutputStream.writeInt()写入长度,使用DataInputStream.readInt()读取它,并使用相同的流来读取图像数据。不要在同一个套接字上使用多个流。

  3. 同样在这:

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

    第二行应该是:

    InputStream in = URL.openConnection.getInputStream();
    

    类资源不是文件。