- 浏览: 497541 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (301)
- Swing技术 (1)
- Linux (1)
- Javascript (22)
- 数据结构和算法 (3)
- J2SE (36)
- workflow (5)
- 设计模式 (14)
- web service (19)
- Ajax (14)
- 中间件 & 服务器 (8)
- 多线程 (9)
- Oracle (52)
- sys & soft (10)
- JMS (3)
- sso (9)
- android (11)
- struts2 (10)
- web协议 (2)
- 分布式 (2)
- PM (2)
- OLAP (3)
- Redis (2)
- Hibernate (7)
- ibatis (2)
- SQLServer (1)
- maven (3)
- Spring (7)
- Jsp (2)
- slf4j (1)
- jQuery (15)
- 权限 (1)
- 系统集成 (1)
- 笔记 (1)
- Freemarker (2)
- 项目管理 (1)
- eclipse (3)
- GIS (1)
- NoSql (3)
- win10 (1)
- win10网络 (2)
- 底层 (3)
- 数据库 (0)
最新评论
-
kabuto_v:
请问那种图,uml图是怎么画出来的呢?是您自己手工画的,还是有 ...
FastJSON 序列化、反序列化实现 -
梦行Monxin商城系统:
电商实例、业务并发、网站并发及解决方法 -
rockethj8:
client 㓟有一个参数是可以忽略一些URL 不进行验证登录 ...
SSO 之 (单点登录)实施中遇到的几个问题 -
mengxiangfeiyan:
好啊。。。。。
Oracle删除表,删除数据以及恢复数据、利用现有表创建新表
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对象实例了。
上一篇文章说到了用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对象实例了。
发表评论
-
底层读写-NIO实战
2016-03-04 10:51 835最近参与实现底层高并发处理的项目,接收socket ... -
底层网络读写
2016-03-04 10:49 573Java NIO:NIO概述 http://w ... -
java方法返回多个值
2016-01-22 09:11 768http://www.iteye.com/topic/114 ... -
模拟form表单上传图片
2016-01-19 17:23 755转自:http://blog.csdn.net/5iasp ... -
java包装类的几点注意
2016-01-18 10:52 804java中8种基本类型变量对应的包装类: ... -
JAVA调用聚合天气api接口示例
2016-01-15 09:42 4043http://www.iteye.com/topic/114 ... -
java对象序列化过程
2016-01-05 10:22 743一、 http://bbs.csdn.net/topi ... -
Java6 枚举常见7种用法
2014-02-09 23:02 855http://blog.csdn.net/shimiso/a ... -
异常 之 异常体系
2013-10-07 23:00 903J2EE系统异常的处理准则 ... -
异常 之 finally的特殊处理
2013-10-07 22:26 916http://java.chinaitlab.com/expe ... -
Java图片剪裁功能实现
2013-07-28 23:17 1507http://shensy.iteye.com/blog/16 ... -
让frameset居中
2013-07-25 19:59 0JSPHTML 平常我个人开发页面时,一般用width ... -
session生命周期
2013-07-23 08:40 0http://blog.sina.com.cn/s/blog_ ... -
转发和重定向的区别
2013-07-23 08:30 0http://www.2cto.com/kf/201107/9 ... -
NIO 之 BIO和NIO机制和socket
2013-07-14 18:38 1419https://www.ibm.com/developerwo ... -
win7下安装配置tomcat,java运行环境
2013-06-30 19:39 0http://www.cnblogs.com/pannysp/ ... -
JSP之 操作Cookie
2013-06-12 18:09 0Cookie应该是一 ... -
Socket实战之二 多线程通信
2013-05-31 15:15 0http://blog.csdn.net/kongxx/art ... -
Socket实战之七 使用Socket通信传输文件
2013-05-31 15:10 895http://blog.csdn.net/kongxx/art ... -
Socket实战之六 使用NIO包实现Socket通信
2013-05-31 15:06 1158本文地址:http://blog.csdn.net/kongx ...
相关推荐
在C#中,`System.Net.Sockets`命名空间提供了Socket类,该类提供了与TCP、UDP等传输层协议交互的方法。 1. **创建Socket对象** 创建Socket对象是进行网络通信的第一步。你可以通过以下方式创建一个Socket实例: `...
在本示例中,我们将探讨如何使用Socket进行文字内容和文件的传输。Socket在Java、Python、C++等多种编程语言中都有相应的API,这里我们主要以Java为例进行讲解。 1. **Socket基本概念** Socket是网络上的进程间...
总之,这个VB项目提供了学习Socket通信和构建网络聊天室应用的实战示例,对于理解网络编程和VB的结合使用具有很高的价值。开发者可以借此深入了解网络连接的建立、数据传输和多线程处理等相关技术。
- **压缩与加密**:支持数据压缩和安全加密,提高传输效率和安全性。 - **自定义协议栈**:允许用户定义自己的数据包格式和解析规则。 5. **错误处理与调试**: - **日志系统**:记录运行时信息,便于调试和问题...
Socket对象提供了getInputStream()和getOutputStream()方法,分别返回InputStream和OutputStream实例,通过它们可以读取或写入字节数据,实现数据的传输。 4. **异常处理**:在进行Socket编程时,必须考虑到网络...
每一层都有其特定的功能,如物理层负责处理硬件设备,数据链路层处理数据的压缩与解压缩,网络层负责数据的网络传输,等等。了解这一模型对于理解网络通信的流程和原理至关重要。 #### TCP/IP协议 TCP/IP协议是...
1. 压缩与解压缩:为了减少传输时间,MammothCopy可能使用了GZIP或Zip等压缩算法,先压缩文件再进行传输,提高传输效率。 2. 断点续传:对于大文件,断点续传功能是必要的,可以避免因网络中断而需要重新传输整个...
当有客户端连接时,`accept()`方法会返回一个新的Socket对象,通过这个新对象与客户端进行通信。 二、TCP与UDP 1. TCP(Transmission Control Protocol):面向连接的、可靠的传输协议。它确保数据按顺序无错地到达...
【标题】"C++ UDP SOCKET 简单网络通讯实例" 涉及的知识点主要集中在C++编程语言以及网络通信领域,特别是使用UDP(User Datagram Protocol)协议进行数据传输。UDP是传输层的一种无连接协议,它不像TCP那样提供可靠...
《Visual C++网络编程案例实战之FTP客户端》 在本文中,我们将深入探讨如何使用Visual C++编写一个FTP客户端程序,实现与FTP服务器的交互,包括登录、文件上传和下载等基本功能。FTP(File Transfer Protocol)是一...
7. **文件与流操作**:如何读写文件,使用Stream类进行数据传输,如文件复制、压缩和解压缩等。 8. **网络编程**:使用Socket进行网络通信,理解TCP/IP和HTTP协议,创建简单的客户端和服务端程序。 9. **GUI编程**...
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 @符号的...
"rar"标签表明这些源代码是以RAR压缩格式提供的,RAR是一种高效的文件压缩格式,可以将多个文件打包成一个单一的档案,便于存储和传输。 在"疯狂Java实战演义(光盘源代码) CSDN"这个压缩包中,我们可能找到以下...
Socket.IO是基于WebSocket构建的一个库,它在WebSocket不支持或者不稳定的情况下提供了备选的传输机制,以确保实时通信的可靠性。 【描述】:“毕业设计源码资源”提示我们这里可能包含了一个完整的项目源代码,...
《Android网络开发技术实战详解》是一本专注于Android平台网络编程的专著,旨在帮助开发者深入理解和实践Android应用程序中的网络通信技术。这本书详细介绍了如何在Android应用中实现各种网络功能,如HTTP请求、数据...
9. **网络编程**:基础的Socket编程,客户端和服务端的建立连接,数据传输。 10. **实战应用**:通过一个简单的瑞吉外卖系统实例,让学习者实践上述知识点,如订单管理、用户接口等。 这份讲义将为初学者提供一个...
※使用PYTHON SOCKET模块实现文件的远程压缩传输 二、Python中高级课程列表 Python运维开发培训中高级课程列表 第七天 1、项目实战六、编写类Nagios监控软件框架 2、编写监控服务器server 端 3、实现自动监控...
此外,还可以考虑引入压缩传输(如gzip)以减少网络传输的数据量,提高传输效率。 在实际项目中,我们还可能遇到安全问题,如防止DDoS攻击、处理HTTP头部注入等。因此,理解基本的安全实践也是必要的。 总之,通过...
总的来说,这个基于Socket的聊天程序项目是一个综合性的实践,涵盖了网络编程、数据存储、用户认证、多线程处理等多个方面的知识,对于学习和掌握Java网络编程有很好的实战价值。通过这样的课程设计,学生能够深入...
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 @符号的...