客户端序列化后封装在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........