上一篇文章说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较大的情况下需要把数据对象进行压缩然后在传输,此时就需要压缩这些对象流,此时就可以GZIPInputStream和GZIPOutputStream来处理一下socket的InputStream和OutputStream。

创新互联建站长期为千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为吉安企业提供专业的成都网站设计、做网站,吉安网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。
仍然需要一个实现了java.io.Serializable接口的简单Java对象:
- package com.googlecode.garbagecan.test.socket.sample4;
 - public class User implements java.io.Serializable {
 - private static final long serialVersionUID = 1L;
 - private String name;
 - private String password;
 - public User() {
 - }
 - public User(String name, String password) {
 - this.name = name;
 - this.password = password;
 - }
 - public String getName() {
 - return name;
 - }
 - public void setName(String name) {
 - this.name = name;
 - }
 - public String getPassword() {
 - return password;
 - }
 - public void setPassword(String password) {
 - this.password = password;
 - }
 - }
 
在Server端使用,socket的InputStream首先被包装成GZIPInputStream,然后又被包装成ObjectInputStream,而socket的OutputStream首先被包装成GZIPOutputStream,然后又被包装成ObjectOutputStream,如下:
- package com.googlecode.garbagecan.test.socket.sample4;
 - import java.io.IOException;
 - import java.io.ObjectInputStream;
 - import java.io.ObjectOutputStream;
 - import java.net.ServerSocket;
 - import java.net.Socket;
 - import java.util.logging.Level;
 - import java.util.logging.Logger;
 - import java.util.zip.GZIPInputStream;
 - import java.util.zip.GZIPOutputStream;
 - public class MyServer {
 - private final static Logger logger = Logger.getLogger(MyServer.class.getName());
 - public static void main(String[] args) throws IOException {
 - ServerSocket server = new ServerSocket(10000);
 - while (true) {
 - Socket socket = server.accept();
 - socket.setSoTimeout(10 * 1000);
 - invoke(socket);
 - }
 - }
 - private static void invoke(final Socket socket) throws IOException {
 - new Thread(new Runnable() {
 - public void run() {
 - GZIPInputStream gzipis = null;
 - ObjectInputStream ois = null;
 - GZIPOutputStream gzipos = null;
 - ObjectOutputStream oos = null;
 - try {
 - gzipis = new GZIPInputStream(socket.getInputStream());
 - ois = new ObjectInputStream(gzipis);
 - gzipos = new GZIPOutputStream(socket.getOutputStream());
 - oos = new ObjectOutputStream(gzipos);
 - Object obj = ois.readObject();
 - User user = (User)obj;
 - System.out.println("user: " + user.getName() + "/" + user.getPassword());
 - user.setName(user.getName() + "_new");
 - user.setPassword(user.getPassword() + "_new");
 - oos.writeObject(user);
 - oos.flush();
 - gzipos.finish();
 - } catch (IOException ex) {
 - logger.log(Level.SEVERE, null, ex);
 - } catch(ClassNotFoundException ex) {
 - logger.log(Level.SEVERE, null, ex);
 - } finally {
 - try {
 - ois.close();
 - } catch(Exception ex) {}
 - try {
 - oos.close();
 - } catch(Exception ex) {}
 - try {
 - socket.close();
 - } catch(Exception ex) {}
 - }
 - }
 - }).start();
 - }
 - }
 
Client也和Server端类似,同样要不socket的XXXStream包装成GZIPXXXStream,然后再包装成ObjectXXXStream,如下:
- package com.googlecode.garbagecan.test.socket.sample4;
 - import java.io.IOException;
 - import java.io.ObjectInputStream;
 - import java.io.ObjectOutputStream;
 - import java.net.InetSocketAddress;
 - import java.net.Socket;
 - import java.net.SocketAddress;
 - import java.util.logging.Level;
 - import java.util.logging.Logger;
 - import java.util.zip.GZIPInputStream;
 - import java.util.zip.GZIPOutputStream;
 - public class MyClient {
 - private final static Logger logger = Logger.getLogger(MyClient.class.getName());
 - public static void main(String[] args) throws Exception {
 - for (int i = 0; i < 10; i++) {
 - Socket socket = null;
 - GZIPOutputStream gzipos = null;
 - ObjectOutputStream oos = null;
 - GZIPInputStream gzipis = null;
 - ObjectInputStream ois = null;
 - try {
 - socket = new Socket();
 - SocketAddress socketAddress = new InetSocketAddress("localhost", 10000);
 - socket.connect(socketAddress, 10 * 1000);
 - socket.setSoTimeout(10 * 1000);
 - gzipos = new GZIPOutputStream(socket.getOutputStream());
 - oos = new ObjectOutputStream(gzipos);
 - User user = new User("user_" + i, "password_" + i);
 - oos.writeObject(user);
 - oos.flush();
 - gzipos.finish();
 - gzipis = new GZIPInputStream(socket.getInputStream());
 - ois = new ObjectInputStream(gzipis);
 - Object obj = ois.readObject();
 - if (obj != null) {
 - user = (User)obj;
 - System.out.println("user: " + user.getName() + "/" + user.getPassword());
 - }
 - } catch(IOException ex) {
 - logger.log(Level.SEVERE, null, ex);
 - }
 - try {
 - oos.close();
 - } catch (IOException e) {
 - }
 - try {
 - ois.close();
 - } catch (IOException e) {
 - }
 - try {
 - socket.close();
 - } catch (IOException e) {
 - }
 - }
 - }
 - }
 
***测试上面的代码,首先运行Server类,然后运行Client类,就可以分别在Server端和Client端控制台看到接收到的User对象实例了。
原文链接:http://blog.csdn.net/kongxx/article/details/7259834
                本文标题:JavaSocket实战之四:传输压缩对象
                
                文章来源:http://www.csdahua.cn/qtweb/news20/480570.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网