我用Java socket发送pdf附件的时,会出现乱码,并且出现问题的附件会比原来的附件大1K左右,我怀疑是写出来的附件多出了什么其他的东西,我也写到pdf文件里去 ,所以导致pdf乱码。而且这个问题不是每次都出现,有20%~左右的几率收到的附件是正常的。。各位朋友帮我看看这是什么问题?socketjava

解决方案 »

  1.   

    你的socket流没有传输文件长度,造成文件长度不对
      

  2.   

    这个是发送代码
    if(BodyLen > 0){
    log.warn("直接返回附件");
    clientOS.write(Header.getBytes());
    clientOS.flush();
    int totalCount = 0;

    ByteArrayOutputStream bos = new ByteArrayOutputStream();


    while ((size = wispIS.read(temp)) != -1) {  
    bos.write(temp, 0, size);
    bos.flush();
         totalCount += size;
         if(BodyLen == totalCount){
         break;
         }    
    }
    byte[] b = bos.toByteArray();
    bos.flush();
    bos.close();
    if (Header.indexOf("application/pdf") != -1) {
    OutputStream o = new FileOutputStream("c://223.pdf");
    o.write(b);
    o.flush();
    o.close();
    }
    clientOS.write(b);
    clientOS.flush();
    这个是接收的代码clientOS.write(Header.getBytes());

    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    byte[] returnBytes = new byte[1024];

    int size ;
    long totalCount = 0;
    while ((size = nSafeIS.read(returnBytes)) != -1) {
    totalCount += size;
    bos.write(returnBytes);
    bos.flush();
    if (totalCount == BodyLen) {
    break;
    }
    }
                            byte [] b = bos.toByteArray();
    bos.close();
    if (Header.indexOf("application/pdf") != -1) {
    OutputStream o = new FileOutputStream("c://123.pdf");
    o.write(b);
    o.flush();
    o.close();
    }
    clientOS.write(b);
    clientOS.flush();
    nSafeOS.close();
    nSafeIS.close();我是模拟Http拼出包头包体,所以后面写的时候也是按自己写的包头读的,从socket里读出的长度应该不会错,但是出错的文件会变大就莫名其妙了。另外,发送的时候我写在本地的 223.pdf是没错的,但是123.pdf就出错了。
      

  3.   

    socket的流是读不到-1的,刚开始做socket的时候都会碰到这个问题
      

  4.   

    接收的代码bos.write(returnBytes);改成  bos.write(returnBytes,0,size);
      

  5.   

    你看下我三楼的说明。还以为你说的直接socket传送文件呢
      

  6.   

    你看下我三楼的说明。还以为你说的直接socket传送文件呢
    我照你那么改,问题就解决了。有点纳闷,以前写的时候没注意读取的长度,都没有出现这个问题,没想到这次没这个卡惨了。谢谢你了。
      

  7.   

    你看下我三楼的说明。还以为你说的直接socket传送文件呢
    我照你那么改,问题就解决了。有点纳闷,以前写的时候没注意读取的长度,都没有出现这个问题,没想到这次没这个卡惨了。谢谢你了。
      

  8.   

    这些都是从返回的http包头里读取出来的。
      

  9.   

    这些都是从返回的http包头里读取出来的。
    我以为是你你在流里面通过available方法获取的,这种获取方案不准确,还有读取buff会出现结尾读取不会完整,1024不一定读满,操作方法read会返回你读取到的长度建议写入时候也采取写入长度
      

  10.   

    这些都是从返回的http包头里读取出来的。
    我以为是你你在流里面通过available方法获取的,这种获取方案不准确,还有读取buff会出现结尾读取不会完整,1024不一定读满,操作方法read会返回你读取到的长度建议写入时候也采取写入长度

    嗯,其实知道这个问题,但是一直没重视,之前有的时候没写读取长度也不会出错,这次出了这问题也没想到这个。困扰了我大半天。