socket编程之obj压缩加密传输
因为需要序列化这个对象以便在网络上传输。所以POJO必需要实现java.io.Serializable接口。使用了
ObjectInputStream和ObjectOutputStream来接收和发送socket中的InputStream和OutputStream。然
后转换成Java对象。
client与server之间socket双向通信,因此要注意io读写的堵塞问题。client在写完数据时要记得
flush一下,然后再读数据,服务端从Socket的InputStream中读取数据的操作也是堵塞式的,假设
从输入流中没有读取到数据程序会一直在那里不动,直到client往Socket的输出流中写入了数据,
或关闭了Socket的输出流。
在读写object时用到了BufferedReader,以下是BufferedReader与InputReader差别
BufferedReader类
BufferedReader 由Reader类扩展而来,提供通用的缓冲方式文本读取,并且提供了非常有用的readLine。
读取一个文本行。从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
一般使用方法:
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
InputStreamReader 类
是字节流通向字符流的桥梁,封裝了InputStream在里头, 它以较高级的方式,一次读取一个一个字符。以文本格
式输入 / 输出,能够指定编码格式;
一般使用方法:
InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
}
server端代码
public class server {
public static void main(String args[]) throws IOException{
//为了简单起见,全部的异常信息都往外抛
int port = 8899;
//定义一个ServerSocket监听在端口8899上
ServerSocket server = new ServerSocket(port); while(true){ //server尝试接收其它Socket的连接请求。server的accept方法是堵塞式的
Socket socket=server.accept(); //每接收到一个Socket就建立一个新的线程来处理它
new Thread(new Task(socket)).start();
}
}
static class Task implements Runnable{
//静态内部类 private Socket socket; public Task(Socket socket){
this.socket=socket;
} @Override
public void run() {
ObjectInputStream oi = null;
ObjectOutputStream oo = null;
try{
handleSocket(oi,oo);
}
catch(Exception e){
e.printStackTrace();
}
finally{
try {
oi.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
oo.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} private void handleSocket(ObjectInputStream oi,ObjectOutputStream oo) throws Exception{
//跟client建立好连接之后。我们就能够获取socket的InputStream,并从中读取client发过来的信息了。 oi=new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
//获取obj
Object obj= oi.readObject();
ShopInfo shopInfo=(ShopInfo)obj; System.out.println("from client: " + shopInfo.getShopName()); //获取输出流
oo=new ObjectOutputStream(socket.getOutputStream()); shopInfo.setShopName("东山再起");
//写对象
oo.writeObject(shopInfo);
//冲一下,从缓冲区写入
oo.flush();
} } }
client代码
public class client {
public static void main(String args[]) throws Exception { //为了简单起见,全部的异常都直接往外抛
String host = "192.168.1.134"; //要连接的服务端IP地址
int port = 8899; //要连接的服务端相应的监听端口
//与服务端建立连接
Socket client = new Socket(host, port);
//建立连接后就能够往服务端写数据了
ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream()); ShopInfo shopInfo=new ShopInfo();
shopInfo.setShopName("雷霆万钧");
os.writeObject(shopInfo);
os.flush();
ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
Object obj= is.readObject();
if(obj != null){
ShopInfo shop=(ShopInfo)obj;
System.out.println("from server: " + shop.getShopName());
}
is.close();
os.close();
client.close();
}
}
POJO实体
public class ShopInfo extends Serializable{
private static final long serialVersionUID = 1L; /**
* 店铺名称
*/
private String shopName; public void setShopName(String shopName){
this.shopName = shopName;
} public String getShopName(){
return this.shopName;
}
}
执行结果如图
在有些情况下比方网络环境不好或者对象比較大的情况下须要把数据对象进行压缩然后在传输,此时就须要压缩这些
对象流,此时就能够GZIPInputStream和GZIPOutputStream来处理一下socket的InputStream和OutputStream。
仍然须要一个实现了java.io.Serializable接口的简单Java对象。
以下为代码演示样例】
server端代码
public class server {
public static void main(String args[]) throws IOException{
//为了简单起见,全部的异常信息都往外抛
int port = 8899;
//定义一个ServerSocket监听在端口8899上
ServerSocket server = new ServerSocket(port); while(true){ //server尝试接收其它Socket的连接请求,server的accept方法是堵塞式的
Socket socket=server.accept(); //每接收到一个Socket就建立一个新的线程来处理它
new Thread(new Task(socket)).start();
}
}
static class Task implements Runnable{
//静态内部类 private Socket socket; public Task(Socket socket){
this.socket=socket;
} @Override
public void run() {
ObjectInputStream oi = null;
ObjectOutputStream oo = null;
try{
handleSocket(oi,oo);
}
catch(Exception e){
e.printStackTrace();
}
finally{
try {
oi.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
oo.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} private void handleSocket(ObjectInputStream oi,ObjectOutputStream oo) throws Exception{
//跟client建立好连接之后,我们就能够获取socket的InputStream。并从中读取client发过来的信息了。
//oi=new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
GZIPInputStream gzipos=new GZIPInputStream(socket.getInputStream());
oi=new ObjectInputStream(gzipos);
//获取obj
Object obj= oi.readObject();
ShopInfo shopInfo=(ShopInfo)obj; System.out.println("from client: " + shopInfo.getShopName()); //获取输出流
oo=new ObjectOutputStream(socket.getOutputStream()); shopInfo.setShopName("东山再起");
//写对象
oo.writeObject(shopInfo);
//冲一下,从缓冲区写入
oo.flush();
} } }
client代码
public class client {
public static void main(String args[]) throws Exception { //为了简单起见,全部的异常都直接往外抛
String host = "192.168.1.134"; //要连接的服务端IP地址
int port = 8899; //要连接的服务端相应的监听端口
//与服务端建立连接
Socket client = new Socket(host, port);
//建立连接后就能够往服务端写数据了
//ObjectOutputStream os = new ObjectOutputStream(client.getOutputStream());
GZIPOutputStream gzipos = new GZIPOutputStream(client.getOutputStream());
ObjectOutputStream os = new ObjectOutputStream(gzipos);
ShopInfo shopInfo=new ShopInfo();
shopInfo.setShopName("雷霆万钧");
os.writeObject(shopInfo);
os.flush();
gzipos.finish();
ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(client.getInputStream()));
Object obj= is.readObject();
if(obj != null){
ShopInfo shop=(ShopInfo)obj;
System.out.println("from server: " + shop.getShopName());
}
is.close();
os.close(); client.close();
}
}
使用加密协议传输对象
在获取到ServerSocket和Socket实例以后。剩下的代码就和不使用加密方式一样了。
keytool -genkey -alias mysocket -keyalg RSA -keystore mysocket.jks
在提示输入项中,password项自己给定,其他都不改直接回车,这里我使用的password是“123123”。
执行Server
java -Djavax.net.ssl.keyStore=mysocket.jks -Djavax.net.ssl.keyStorePassword=123123 com.test.garbagecan.test.socket.ssl.MyServer
执行Client
java -Djavax.net.ssl.trustStore=mysocket.jks -Djavax.net.ssl.trustStorePassword=123123 com.test.garbagecan.test.socket.ssl.MyClient
socket编程之obj压缩加密传输的更多相关文章
- 老雷socket编程之websocket实现
老雷socket编程之websocket实现 我们主要实现私聊和群聊两个功能,要在web端实现想微信QQ那样的即时通讯的功能,我们需要了解一下websocket.websocket是一种可以双向通讯的 ...
- [深入浅出WP8.1(Runtime)]Socket编程之UDP协议
13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...
- iPhone socket 编程之BSD Socket篇
iPhone socket 编程之BSD Socket篇 收藏在进行iPhone网络通讯程序的开发中,不可避免的要利用Socket套接字.iPhone提供了Socket网络编程的接口CFSocket, ...
- 老雷socket编程之PHP利用socket扩展实现聊天服务
老雷socket编程之PHP利用socket扩展实现聊天服务 socket聊天服务原理 PHP有两个socket的扩展 sockets和streamssockets socket_create(AF_ ...
- PHP Socket 编程之9个主要函数的使用之测试案例
php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络 ...
- Python socket编程之二:【struct.pack】&【struct.unpack】
import struct """通过 socket 的 send 和 recv 只能传输 str 格式的数据""" "" ...
- Linux系统编程(32)—— socket编程之TCP服务器与客户端
TCP协议的客户端/服务器程序的一般流程 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后, ...
- Linux系统编程(30)—— socket编程之TCP/IP协议
在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样.计算机使用者意识到,计算机 ...
- linux socket编程之TCP与UDP
转:http://blog.csdn.net/gaoxin1076/article/details/7262482 TCP/IP协议叫做传输控制/网际协议,又叫网络通信协议 TCP/IP虽然叫传输控制 ...
随机推荐
- xcode6 dyld_sim is not owned by root
如果运行复制过来的xcode可能会这个提示,xcode6 dyld_sim is not owned by root解决方法打开终端 输入sudo xcode-select -switch /Appl ...
- RabbitMQ之任务队列【译】
在第一个教程里面,我们写了一个程序从一个有名字的队列中发送和接收消息,在这里我们将要创建一个分发耗时任务给多个worker的任务队列. 任务队列核心思想就是避免执行一个资源密集型的任务,而程序要等待其 ...
- ssh2——Interceptor拦截器
尽管没学过struts1吧.可是了解到struts1中并没有拦截器, 到Struts2才有.它是基于WebWork发展起来的, 顾名思义,说到拦截器大家首先肯定会想到它是拦截东西的,起到一个限制的作 ...
- 重新=》easyui DataGrid是否可以动态的改变列显示的顺序
$.extend($.fn.datagrid.methods,{ columnMoving: function(jq){ return jq.each(function(){ var target = ...
- C++ 类的继承一(访问控制)
//类的继承 #include<iostream> using namespace std; /* 面向对象中的继承类之间的父子关系 1.子类拥有父类所有的成员属性和成员函数(包括私有成员 ...
- jquery cdn加速注意事项
1, <script src="http://libs.baidu.com/jquery/1.7.2/jquery.min.js"></script> 这里 ...
- Java中arraylist和linkedlist源代码分析与性能比較
Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...
- sdut 2154:Shopping(第一届山东省省赛原题,水题)
Shopping Time Limit: 1000MS Memory limit: 65536K 题目描述 Saya and Kudo go shopping together.You can ass ...
- 将Oracle数据库转换为SQL Server
(转发)近期为公司的一个项目数据库进行了转换,将Oracle的Db转换为SqlServer(2000或2005均可),一开始在网上找了一些资料,发现有个工具叫SwisSql的,尝试了一下,没成功,继续 ...
- GSAP 官方文档(结贴)
好久没写GSAP的教程的(其实我也不懂哈哈),国内也没什么人用,不对动画要求特别高的话,其实也没必要用GSAP,现在工作上没用到这个东西,也懒得写了,所以有问题的话去找一下greensock的官方文档 ...