1 pb协议
server:
使用spring boot
// 将服务器容器http body序列化方式指定为pb /** * protobuf 序列化 */ @Bean ProtobufHttpMessageConverter protobufHttpMessageConverter() { return new ProtobufHttpMessageConverter(); } /** * protobuf 反序列化 */ @Bean RestTemplate restTemplate(ProtobufHttpMessageConverter protobufHttpMessageConverter) { return new RestTemplate(Collections.singletonList(protobufHttpMessageConverter)); }
这两个bean告诉springboot,使用pb序列化
@Controller @RequestMapping("/pb") public class PbController { @RequestMapping(value = "/test", produces = "application/x-protobuf") @ResponseBody public MyBaseProto.BaseProto getPersonProto(@RequestBody MyBaseProto.BaseProto request) { MyBaseProto.BaseProto.Builder builder = MyBaseProto.BaseProto.newBuilder(); builder.setCode(request.getCode() + 1); builder.setMsg(request.getMsg() + "back"); System.out.println(request.getCode() + request.getMsg()); return builder.build(); } }
client:
java.net.URL object = new URL("http://127.0.0.1:8080/pb/test"); HttpURLConnection con = (HttpURLConnection) object.openConnection(); con.setDoOutput(true); con.setDoInput(true); // 此句必须,否则默认application/x-www-form-urlencoded;charset=UTF-8 // */*也不行,服务器spring boot不认 con.setRequestProperty("Content-Type", "application/x-protobuf"); // 此句可省略 // con.setRequestProperty("Accept", "application/x-protobuf"); // 此句可省略 // con.setRequestMethod("POST"); // json协议,本文不用 /** JSONObject data = new JSONObject(); JSONObject tel = new JSONObject(); tel.put("nationcode", nationCode); String phone = phoneNumber; tel.put("phone", phone); data.put("type", "0"); data.put("msg", content); String sig = stringMD5(APPKEY.concat(phone)); data.put("sig", sig); data.put("tel", tel); */ // pb协议,自定义http协议 MyBaseProto.BaseProto.Builder builder = MyBaseProto.BaseProto.newBuilder(); builder.setCode(1); builder.setMsg("test"); byte [] pb = builder.build().toByteArray(); OutputStream wr = con.getOutputStream(); wr.write(pb); wr.flush(); // 显示 POST 请求返回的内容 StringBuilder sb = new StringBuilder(); int HttpResult = con.getResponseCode(); if (HttpResult == HttpURLConnection.HTTP_OK) { InputStream inputStream = con.getInputStream(); ByteArrayOutputStream result = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) != -1) { result.write(buffer, 0, length); } MyBaseProto.BaseProto baseProto = MyBaseProto.BaseProto.parseFrom(result.toByteArray()); System.out.println(baseProto.getCode() + baseProto.getMsg()); } else { System.out.println("http error"); }
参考:https://blog.csdn.net/u013219624/article/details/83152806
2 jdk序列化
server:使用jetty
import java.io.*; import javax.servlet.*; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; import org.eclipse.jetty.servlet.ServletHolder; import serial.MyBaseBean; public class EmbeddingJettyWithServlet { public static void main(String[] args) throws Exception { Server server = new Server(8080); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/jdk"); server.setHandler(context); context.addServlet(new ServletHolder(new HelloServlet()), "/test"); server.start(); } public static class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { dohandle(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { dohandle(req, resp); } private void dohandle(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { MyBaseBean myBaseBean = null; try { InputStream inputStream = req.getInputStream(); ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); try { myBaseBean = (MyBaseBean)objectInputStream.readObject(); } catch (ClassNotFoundException e) { e.printStackTrace(); } System.out.println("get--" + myBaseBean.getCode() + myBaseBean.getMsg()); } catch (Exception e) { e.printStackTrace(); } if(myBaseBean == null) myBaseBean = new MyBaseBean(); myBaseBean.setCode(myBaseBean.getCode() + 1); myBaseBean.setMsg(myBaseBean.getMsg() + "back"); resp.setContentType("text/html"); resp.setStatus(HttpServletResponse.SC_OK); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(myBaseBean); OutputStream outputStream = resp.getOutputStream(); outputStream.write(byteArrayOutputStream.toByteArray()); outputStream.flush(); } }
浏览器访问:http://localhost:8080/jdk/test
�srserial.MyBaseBean襹s臥H<�IcodeLmsgtLjava/lang/String;xpttestback
client:
URL object = new URL("http://127.0.0.1:8080/jdk/test"); HttpURLConnection con = (HttpURLConnection) object.openConnection(); con.setDoOutput(true); con.setDoInput(true); // jdk协议,自定义http协议 MyBaseBean myBaseBean = new MyBaseBean(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(myBaseBean); objectOutputStream.flush(); byte [] pb = byteArrayOutputStream.toByteArray(); OutputStream wr = con.getOutputStream(); wr.write(pb); wr.flush(); // 显示 POST 请求返回的内容 StringBuilder sb = new StringBuilder(); int HttpResult = con.getResponseCode(); if (HttpResult == HttpURLConnection.HTTP_OK) { InputStream inputStream = con.getInputStream(); ObjectInputStream objectInputStream = new ObjectInputStream(inputStream); MyBaseBean myBaseBean1 = (MyBaseBean)objectInputStream.readObject(); System.out.println(myBaseBean1.getCode() + myBaseBean1.getMsg()); } else { System.out.println("http error"); }
参考:http://www.mamicode.com/info-detail-2224013.html