`
edwin492
  • 浏览: 113164 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Http隧道

    博客分类:
  • J2SE
阅读更多

 客户端序列化后封装在http中发送到服务端再进行反序列化操作,故此Message类必须是可序列化的,

   而且两端的类名必须相同。而在webservice中应用了SOAP(简单对象访问协议)实为对xml的序列化与反序列化。

   故HttpTunnel应用于Java方面,而webService可以应用在Java\.Net........ 

服务端servlet

public class HttpServer extends HttpServlet{
	@Override
	public void service(HttpServletRequest req, HttpServletResponse rsp){
		Message msg = (Message)this.reciveMsg(req);
		System.out.println("server recive msg ...." + msg);
		msg.setName("456");
		msg.setSignature("12345678910");
		sendMsg(rsp,msg);
		System.out.println("server send message...." + msg);
	}
	
	//发送数据
	public void sendMsg(HttpServletResponse rsp, Object msg){
		ByteArrayOutputStream baos = null;
		ObjectOutputStream oos = null;
		ServletOutputStream  sos = null;
		rsp.setContentType("application/octet-stream");
		try {
			//ByteArrayOutputStream针对字节数组的输出流,将数据从流中写入到字节数组中
			//ByteArrayInputStream从字节数组中读出数据到流中
			baos = new ByteArrayOutputStream();
			//ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream
			//只支持序列化的对象 
			oos = new ObjectOutputStream(baos);
			oos.writeObject(msg);
			byte[] buffer = baos.toByteArray();
			sos = rsp.getOutputStream(); 
			rsp.setContentLength(buffer.length);
			sos.write(buffer);
			sos.flush();
		} catch (IOException e) {
			e.printStackTrace();   
		}finally{
			try {
				if(null != baos){
					baos.close();
				}
				if(null != oos){
					oos.close();
				}
				if(null != sos){
					sos.close();
				}
			} catch (IOException e) {
				e.printStackTrace();   
			}
		}
	}
	
	//接收数据
	public Object reciveMsg(HttpServletRequest req){
		Message msg = null;
		try {
			ServletInputStream sis = req.getInputStream();
			ObjectInputStream ois = new ObjectInputStream(sis);
			msg = (Message)ois.readObject();
		} catch (Exception e) {
			e.printStackTrace();   
		}
		return msg;
	}
	
}

 Message类封装数据,服务端与客户端相同

public class Message implements Serializable{
	
	private static final long serialVersionUID = 6460238717630911305L;
	
	private String name;
	private String signature;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSignature() {
		return signature;
	}
	public void setSignature(String signature) {
		this.signature = signature;
	}
	
	public String toString(){
		return "name="+this.name+" signature=" + this.signature;
	}
}

 web.xml配置servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<servlet>
		<servlet-name>HttpServer</servlet-name>
		<servlet-class>com.httptunnel.server.HttpServer</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>HttpServer</servlet-name>
		<url-pattern>/httpServer</url-pattern>
	</servlet-mapping>
	
	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 客户端

public class HttpClient {

	public void sendAndRec(Object msg){
		URLConnection con = null;
		ByteArrayOutputStream baos = null;
		ObjectOutputStream oos = null;
		DataOutputStream dos = null;
		ObjectInputStream ois = null;
		try {
			URL url = new URL("http://localhost:8080/HttpTunnelServer/httpServer");
			con = url.openConnection(); 
			con.setUseCaches(false);
			con.setDoInput(true);
			con.setDoOutput(true);
			baos = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(baos);
			oos.writeObject(msg);
			oos.flush();
			byte[] buffer = baos.toByteArray();
			con.setRequestProperty("content-type", "application/octet-stream");
			con.setRequestProperty("content-length", buffer.length+"");
			dos = new DataOutputStream(con.getOutputStream());
			dos.write(buffer);
			dos.flush(); 
			System.out.println("client send ...." + msg);
			//con.getInputStream()时才发送数据?
			InputStream is = con.getInputStream();
			ois = new ObjectInputStream(is);
			Object message = (Object) ois.readObject(); //读取服务端的数据
			System.out.println("client recive ...." + message);
		} catch (Exception e) {
			e.printStackTrace();   
		}finally{
			try {
				if(null != baos){
					baos.close();
				}
				if(null != oos){
					oos.close();
				}
				if(null != dos){
					dos.close();
				}
				if(null != ois){
					ois.close();
				}
			} catch (Exception e) {
				e.printStackTrace();   
			}
		}
	}
	
	public static void main(String[] args) {
		HttpClient client = new HttpClient();
		Message msg = new Message();
		msg.setName("123");
		msg.setSignature("12345 work is tired...");
		client.sendAndRec(msg);
	}

}
   客户端序列化后封装在http中发送到服务端再进行反序列化操作,故此Message类必须是可序列化的,

   而且两端的类名必须相同。而在webservice中应用了SOAP(简单对象访问协议)实为对xml的序列化与反序列化。

   故HttpTunnel应用于Java方面,而webService可以应用在Java\.Net........ 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics