要求是服务器传送的输出流 有定长的报文头,报文头里说明了报文内容的长度,这个报文内容发送前使用lz77算法给压缩过。问题是压缩完了后,socket客户端怎么接收呢,lz77的压缩结果解读时要先读一个int型,比如固定是4个字节,然后可能要读一个char,但是这个char型,无法确定是多长啊?gb2312编码的话,他有时是1个字节,有时是2个字节的。UTF-8编码的话,这个字节数则可能会从1个字节到4个字节不等,都是变长的,我如何才能解读被lz77压缩过的流呢?如果不好弄的话,谁能给介绍一个别的对socket流的压缩方法吗?
gzip的话最后能给个例子(socket传输的),网上多见的是直接压缩文件,小弟对java io流操作是在是不熟,谢谢了!

解决方案 »

  1.   

    服务器端代码           try { OutputStream outs = socket.getOutputStream();
    GZIPOutputStream gouts = new GZIPOutputStream(outs);
    gouts.write("abcdefg".getBytes());
    } catch (IOException e) {
    e.printStackTrace();
    }
    客户端代码InputStream ins = socket.getInputStream();
    GZIPInputStream gins = new GZIPInputStream(ins);
    byte[] rb = new byte[1];
    while ((gins.read(rb,0,rb.length)) != -1) 

         System.out.println(new String(rb));
    }

    报错
    java.net.SocketException: Software caused connection abort: recv failed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.util.zip.InflaterInputStream.fill(Unknown Source)
    at java.util.zip.InflaterInputStream.read(Unknown Source)
    at java.util.zip.GZIPInputStream.read(Unknown Source)
    at gzip.SocketClientTest.run(SocketClientTest.java:49) 帮我看看吧
      

  2.   

    没人应,已经使用gzip结合ByteArrayOutputStream实现了,呵呵
      

  3.   

    呵呵 我思考加试验的结果是,socket的关闭既要在服务端进行,客户端也要进行,否则服务端或有好多处于TIME WAIT的TCP连接呢