`

Socket实战之四 传输压缩对象

    博客分类:
  • J2SE
阅读更多
http://blog.csdn.net/kongxx/article/details/7259834
上一篇文章说到了用Java Socket来传输对象,但是在有些情况下比如网络环境不好或者对象比较大的情况下需要把数据对象进行压缩然后在传输,此时就需要压缩这些对象流,此时就可以GZIPInputStream和GZIPOutputStream来处理一下socket的InputStream和OutputStream。

仍然需要一个实现了java.io.Serializable接口的简单Java对象
[java] view plaincopyprint?
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,如下:
[java] view plaincopyprint?
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,如下:
[java] view plaincopyprint?
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); 
            } finally { 
                try { 
                    ois.close(); 
                } catch(Exception ex) {} 
                try { 
                    oos.close(); 
                } catch(Exception ex) {} 
                try { 
                    socket.close(); 
                } catch(Exception ex) {} 
            } 
        } 
    } 



最后测试上面的代码,首先运行Server类,然后运行Client类,就可以分别在Server端和Client端控制台看到接收到的User对象实例了。
分享到:
评论

相关推荐

    c# Socket实例

    在C#中,`System.Net.Sockets`命名空间提供了Socket类,该类提供了与TCP、UDP等传输层协议交互的方法。 1. **创建Socket对象** 创建Socket对象是进行网络通信的第一步。你可以通过以下方式创建一个Socket实例: `...

    socket的使用demo

    在本示例中,我们将探讨如何使用Socket进行文字内容和文件的传输。Socket在Java、Python、C++等多种编程语言中都有相应的API,这里我们主要以Java为例进行讲解。 1. **Socket基本概念** Socket是网络上的进程间...

    socket_test.rar_socket_test_vb socket_聊天室 vb

    总之,这个VB项目提供了学习Socket通信和构建网络聊天室应用的实战示例,对于理解网络编程和VB的结合使用具有很高的价值。开发者可以借此深入了解网络连接的建立、数据传输和多线程处理等相关技术。

    HPSocket 开发指南5.2

    - **压缩与加密**:支持数据压缩和安全加密,提高传输效率和安全性。 - **自定义协议栈**:允许用户定义自己的数据包格式和解析规则。 5. **错误处理与调试**: - **日志系统**:记录运行时信息,便于调试和问题...

    基于Java的源码-Java Socket通信实现.zip

    Socket对象提供了getInputStream()和getOutputStream()方法,分别返回InputStream和OutputStream实例,通过它们可以读取或写入字节数据,实现数据的传输。 4. **异常处理**:在进行Socket编程时,必须考虑到网络...

    基于java的开发源码-远程文件传输工具 MammothCopy.zip

    1. 压缩与解压缩:为了减少传输时间,MammothCopy可能使用了GZIP或Zip等压缩算法,先压缩文件再进行传输,提高传输效率。 2. 断点续传:对于大文件,断点续传功能是必要的,可以避免因网络中断而需要重新传输整个...

    Visual C++网络编程案例实战.pdf

    每一层都有其特定的功能,如物理层负责处理硬件设备,数据链路层处理数据的压缩与解压缩,网络层负责数据的网络传输,等等。了解这一模型对于理解网络通信的流程和原理至关重要。 #### TCP/IP协议 TCP/IP协议是...

    Android Socket编程

    当有客户端连接时,`accept()`方法会返回一个新的Socket对象,通过这个新对象与客户端进行通信。 二、TCP与UDP 1. TCP(Transmission Control Protocol):面向连接的、可靠的传输协议。它确保数据按顺序无错地到达...

    C++ UDP SOCKET 简单网络通讯实例

    【标题】"C++ UDP SOCKET 简单网络通讯实例" 涉及的知识点主要集中在C++编程语言以及网络通信领域,特别是使用UDP(User Datagram Protocol)协议进行数据传输。UDP是传输层的一种无连接协议,它不像TCP那样提供可靠...

    2022年优秀-VisualC网络编程案例实战之FTP客户端.pptx

    《Visual C++网络编程案例实战之FTP客户端》 在本文中,我们将深入探讨如何使用Visual C++编写一个FTP客户端程序,实现与FTP服务器的交互,包括登录、文件上传和下载等基本功能。FTP(File Transfer Protocol)是一...

    c#典型模块与项目实战大全源代码1-10

    7. **文件与流操作**:如何读写文件,使用Stream类进行数据传输,如文件复制、压缩和解压缩等。 8. **网络编程**:使用Socket进行网络通信,理解TCP/IP和HTTP协议,创建简单的客户端和服务端程序。 9. **GUI编程**...

    亮剑.NET深入体验与实战精要3

    1.4 .NET的面向对象之门 27 1.4.1 继承——“子承父业” 28 1.4.2 委托——“任务书” 35 1.4.3 事件——“年终分红” 42 1.4.4 反射——“解剖” 49 1.5 .NET开发几把小刀 52 1.5.1 using之多变身 52 1.5.2 @符号的...

    疯狂Java实战演义(光盘源代码) CSDN

    "rar"标签表明这些源代码是以RAR压缩格式提供的,RAR是一种高效的文件压缩格式,可以将多个文件打包成一个单一的档案,便于存储和传输。 在"疯狂Java实战演义(光盘源代码) CSDN"这个压缩包中,我们可能找到以下...

    聊天室、websocket、socket.io、毕业设计。.zip

    Socket.IO是基于WebSocket构建的一个库,它在WebSocket不支持或者不稳定的情况下提供了备选的传输机制,以确保实时通信的可靠性。 【描述】:“毕业设计源码资源”提示我们这里可能包含了一个完整的项目源代码,...

    android网络开发技术实战详解电子书

    《Android网络开发技术实战详解》是一本专注于Android平台网络编程的专著,旨在帮助开发者深入理解和实践Android应用程序中的网络通信技术。这本书详细介绍了如何在Android应用中实现各种网络功能,如HTTP请求、数据...

    瑞吉外卖第一天的讲义压缩

    9. **网络编程**:基础的Socket编程,客户端和服务端的建立连接,数据传输。 10. **实战应用**:通过一个简单的瑞吉外卖系统实例,让学习者实践上述知识点,如订单管理、用户接口等。 这份讲义将为初学者提供一个...

    老男孩python 四期

    ※使用PYTHON SOCKET模块实现文件的远程压缩传输 二、Python中高级课程列表 Python运维开发培训中高级课程列表 第七天 1、项目实战六、编写类Nagios监控软件框架 2、编写监控服务器server 端 3、实现自动监控...

    HttpServer 项目实战-资料包

    此外,还可以考虑引入压缩传输(如gzip)以减少网络传输的数据量,提高传输效率。 在实际项目中,我们还可能遇到安全问题,如防止DDoS攻击、处理HTTP头部注入等。因此,理解基本的安全实践也是必要的。 总之,通过...

    基于socket的聊天程序+课程设计报告(包括登录,注册,显示在线人数,JAVA)

    总的来说,这个基于Socket的聊天程序项目是一个综合性的实践,涵盖了网络编程、数据存储、用户认证、多线程处理等多个方面的知识,对于学习和掌握Java网络编程有很好的实战价值。通过这样的课程设计,学生能够深入...

    亮剑.NET深入体验与实战精要2

    1.4 .NET的面向对象之门 27 1.4.1 继承——“子承父业” 28 1.4.2 委托——“任务书” 35 1.4.3 事件——“年终分红” 42 1.4.4 反射——“解剖” 49 1.5 .NET开发几把小刀 52 1.5.1 using之多变身 52 1.5.2 @符号的...

Global site tag (gtag.js) - Google Analytics