调用了finish(),后ZIPStream就算设置了结束位
看看下面的传文件的例子,我随手写的,可能编译有问题,但大体是这样用的:
==========Server:
int ret=0;
byte[] tmpdata=new byte[4096];
byte[] data;
FileInputStream in=new FileInputStream("Test.txt");
Socket client=server.accept();
BufferedOutputStream out=new BufferedOutputStream(new GZIPOutputStream(client.getOutputStream()));
do{
ret=in.read(tmpdata);
System.out.println(ret);
if(ret==-1) break;
data=new byte[ret];
System.arraycopy(tmpdata, 0, data, 0, ret);
out.write(data);
out.flush();
}while(true);
in.close();
out.close();==========Client:
int ret;
byte[] tmpdata=new byte[4096];
byte[] data;
Socket c=new Socket("heifei", 5050);
InputStream in=c.getInputStream();
FileOutputStream f=new FileOutputStream("Test2.gz");
do{
ret=in.read(tmpdata);
if(ret==-1)break;
data=new byte[ret];
System.arraycopy(tmpdata, 0, data, 0, ret);
f.write(data);
f.flush();
}while(true);
f.close();
in.close();
c.close();

解决方案 »

  1.   

    to:helldogs(孑孓)
    xml一是数据的定义比较困难,二是需要解析有可能速度较慢
    to:heifei()
    我使用更你一样的流包装方式,只调用flush,但不调用finish,数据不发送,在CLIENT端aviable测试为0
      

  2.   

    这是我的一段测试代码: 
    void jButton1_actionPerformed(ActionEvent e) {
        Socket dataSocket = null;
        DataOutputStream outStream = null;
        GZIPOutputStream zipOut = null;
        DataInputStream inStream = null;
        try{
          dataSocket = new Socket("127.0.0.1",2003);
          zipOut = new GZIPOutputStream(dataSocket.getOutputStream());
          outStream = new DataOutputStream(new BufferedOutputStream(zipOut));
          inStream = new DataInputStream(new BufferedInputStream(dataSocket.getInputStream()));      outStream.writeInt(10);
          outStream.flush();      inStream.readInt();      outStream.writeInt(100);
          outStream.flush();
        }catch(IOException ex){
            ex.printStackTrace();
        }finally{
            try{
                if(outStream != null)outStream.close();
                if(inStream != null)inStream.close();
                if(dataSocket != null)dataSocket.close();
            }catch(IOException ex){ex.printStackTrace();}
        }
      }  void jButton2_actionPerformed(ActionEvent e) {
        ServerSocket serverSocket = null;
        Socket dataSocket = null;
        DataOutputStream outStream = null;
        DataInputStream inStream = null;
        try{
          serverSocket = new ServerSocket(2003);
          dataSocket = serverSocket.accept();      outStream = new DataOutputStream(new BufferedOutputStream(dataSocket.getOutputStream()));
          inStream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(dataSocket.getInputStream())));      int rec = inStream.readInt();
          System.out.println("rec1 = "+rec);
          outStream.writeInt(10);
          outStream.flush();      rec = inStream.readInt();
          System.out.println("rec2 = "+rec);    }catch(IOException ex){
            ex.printStackTrace();
        }finally{
            try{
                if(outStream != null)outStream.close();
                if(inStream != null)inStream.close();
                if(dataSocket != null)dataSocket.close();
                if(serverSocket != null)serverSocket.close();
            }catch(IOException ex){ex.printStackTrace();}
        }
      }请帮忙看看,多谢!
      

  3.   

    单从这段代码来看,唯一的问题就是压缩流的使用,在你的程序中:
    write(aByte);
    flush();
    ...
    相当于对单字节压缩,把client端和server端的
    zipOut = new GZIPOutputStream(..)和new GZIPInputStream(..)
    去掉就能正常运行,
    压缩流还是应该用来压缩大数据量的byte[]数据块,单字节谈不上压缩的。
      

  4.   

    我人为的定义下面的b字节数组,并发出去,也不好使:
    byte b[] = new byte[204800];
        int j = 1;
        for(int i=0;i<204800;i++){
            b[i] =  (byte)j;
            j++;
            if(j>125)j=0;
        }
    假如通了,就以前的代码,好象要出异常。
      

  5.   

    下面的代码,把注释段去调就好用。为什么?
    是不是GZIP流不能双工操作?
    (heifei),有空麻烦试试,你那段代码好象也差不多
    =========Client   
        Socket dataSocket = null;
        DataOutputStream outStream = null;
        DataInputStream inStream = null;
        byte b[] = new byte[1024];
        int j = 1;
        for(int i=0;i<1024;i++){
            b[i] = (byte)125;
        }
        try{
          dataSocket = new Socket("127.0.0.1",2003);
          inStream = new DataInputStream(new BufferedInputStream(new    GZIPInputStream(dataSocket.getInputStream())));
          outStream = new DataOutputStream(new BufferedOutputStream(new GZIPOutputStream(dataSocket.getOutputStream())));
          //outStream.write(b);
          outStream.writeInt(100);
          outStream.flush();//下面这段代码去调好用
    /**************************************/
          int ret = inStream.readInt();
          System.out.println(ret);
    /**************************************/    }catch(IOException ex){
            ex.printStackTrace();
        }finally{
          try{
            if(outStream !=null)outStream.close();
            if(inStream !=null)inStream.close();
            if(dataSocket !=null)dataSocket.close();
            }catch(IOException ex){
            }
        }=============Server
     ServerSocket serverSocket = null;
        Socket dataSocket = null;
        DataOutputStream outStream = null;
        DataInputStream inStream = null;
        byte b[] = new byte[1024];
        try{
          serverSocket = new ServerSocket(2003);
          dataSocket = serverSocket.accept();
          outStream = new DataOutputStream(new BufferedOutputStream(new GZIPOutputStream(dataSocket.getOutputStream())));
          inStream = new DataInputStream(new BufferedInputStream(new GZIPInputStream(dataSocket.getInputStream())));
          //int ret = inStream.read(b);
          //System.out.println(ret);
          int ret = inStream.readInt();
          System.out.println(ret);      outStream.writeInt(1000);
          outStream.flush();    }catch(IOException ex){
            ex.printStackTrace();
        }finally{
            try{
                if(inStream != null)inStream.close();
                if(outStream != null)outStream.close();
                if(dataSocket != null)dataSocket.close();
                if(serverSocket != null)serverSocket.close();
            }catch(IOException ex){}
        }
      

  6.   

    GZIP类双共识没有问题的,
    只是你在一个线程里读写,由于write()和read()方法本身是阻塞的,所以当前线程变成“单工”的了。
      

  7.   

    老兄,不对吧!我是启动两个进程,分别执行C和S端,更不用说同一个线程了。另外,我吧GZIP去掉就没有问题。
      

  8.   

    老兄,我找到答案了,
    http://www.jguru.com/faq/view.jsp?EID=3823
      

  9.   

    现在没空,中午我写个demo,
    client连接--服务器将文件10M的文件读入byte【】,下载到客户端-客户端解压,存盘,重新压缩后再上传
    应该不麻烦的。
      

  10.   

    受教了,难怪我发大文件没问题,却发不了‘hello’