Servlet与Client之间的http协议通讯

本文介绍了一个基于Servlet的简单通信示例,包括服务器端和客户端代码。通过HTTP协议进行对象的序列化与反序列化,实现跨网络的数据交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        servlet其实只是作为一个服务端存在,替代了单独写socket实现的server.网上的命名叫"隧道技术",其实不过就是通过http协议,穿墙.真要屏蔽,也不是不可能.

      以下为实现代码

      web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="2.4" 
  3.     xmlns="http://java.sun.com/xml/ns/j2ee" 
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  6.     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  7.   <servlet>
  8.     <servlet-name>basic</servlet-name>
  9.     <servlet-class>communication.BasicServlet</servlet-class>
  10.   </servlet>
  11.   <servlet-mapping>
  12.     <servlet-name>basic</servlet-name>
  13.     <url-pattern>/basic.do</url-pattern>
  14.   </servlet-mapping>
  15. </web-app>

    服务器端    

  1. package communication;
  2. import java.io.IOException;
  3. import java.io.ObjectInputStream;
  4. import java.io.ObjectOutputStream;
  5. import java.util.HashMap;
  6. import java.util.Map;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletInputStream;
  9. import javax.servlet.ServletOutputStream;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. /**
  14.  * @author Shengyan
  15.  * @version 创建时间:2008-8-14 下午01:13:46
  16.  * 类说明:
  17.  */
  18. public class BasicServlet extends HttpServlet {
  19.     @Override
  20.     protected void doGet(HttpServletRequest request, HttpServletResponse response)
  21.             throws ServletException, IOException {
  22.         
  23.         // read
  24.         ServletInputStream sis = request.getInputStream();
  25.         ObjectInputStream ois = new ObjectInputStream(sis);
  26.         try {
  27.             Message readMsg = (Message) ois.readObject();
  28.         } catch (ClassNotFoundException e) {
  29.             e.printStackTrace();
  30.         }
  31.         ois.close();
  32.         
  33.         // write
  34.         ServletOutputStream sos = response.getOutputStream();
  35.         ObjectOutputStream oos = new ObjectOutputStream(sos);
  36.         Message writeMsg = new Message();
  37.         oos.writeObject(writeMsg);
  38.         oos.flush();
  39.         oos.close();
  40.     }
  41.     @Override
  42.     protected void doPost(HttpServletRequest request, HttpServletResponse response)
  43.             throws ServletException, IOException {
  44.         doGet(request, response);
  45.     }
  46. }

    客户端

  1. package communication;
  2. import java.io.IOException;
  3. import java.io.ObjectInputStream;
  4. import java.io.ObjectOutputStream;
  5. import java.net.HttpURLConnection;
  6. import java.net.MalformedURLException;
  7. import java.net.URL;
  8. /**
  9.  * @author Shengyan
  10.  * @version 创建时间:2008-8-18 下午03:23:44
  11.  * 类说明:
  12.  */
  13. public class BasicClient {
  14.     
  15.     private HttpURLConnection connection;
  16.     
  17.     public void connect() {
  18.         String server = "http://localhost";
  19.         String port = "8080";
  20.         String path = "/javaComm/basic.do";
  21.         String timeout ="6000";
  22.         String contentType = "text/html" // 网速快时使用该类型
  23. //      String contentType = "application/octet - stream" // 网速慢时使用该类型
  24.         try {
  25.             URL url = new URL(server + ":" + port + path);
  26.             connection = (HttpURLConnection) url.openConnection();
  27.             connection.setDoInput(true);
  28.             connection.setDoOutput(true);
  29.             connection.setConnectTimeout(Integer.parseInt(timeout));
  30.             connection.setRequestMethod("POST");// Method
  31.             connection.setRequestProperty("Content-type", contentType);
  32.     //      connection.setRequestProperty("Connection", "close");
  33.     //      connection.setRequestProperty("Content-Length",xxx);
  34.         } catch (MalformedURLException e) {
  35.             e.printStackTrace();
  36.         } catch (IOException e) {
  37.             e.printStackTrace();
  38.         }
  39.     }
  40.     
  41.     public Message readMessage() {
  42.         Message vo = null;
  43.         try {
  44.             ObjectInputStream ois = new ObjectInputStream(connection.getInputStream());
  45.             try {
  46.                 vo = (Message) ois.readObject();
  47.             } catch (ClassNotFoundException e) {
  48.                 e.printStackTrace();
  49.             }
  50.             ois.close();
  51.         } catch (IOException e) {
  52.             e.printStackTrace();
  53.         }
  54.         return vo;
  55.     }
  56.     
  57.     public void writeMessage(Message cv) {
  58.         try {
  59.             ObjectOutputStream oos = new ObjectOutputStream(connection.getOutputStream());
  60.             oos.writeObject(cv);
  61.             oos.flush();
  62.             oos.close();
  63.         } catch (IOException e) {
  64.             e.printStackTrace();
  65.         }
  66.             
  67.     }
  68.     
  69.     public int getCode() {
  70.         try { 
  71.             int code = connection.getResponseCode();
  72.             System.out.println("code     " + code);
  73.             return code;
  74.         } catch (IOException e) {
  75.             e.printStackTrace();
  76.             return 0;
  77.         }
  78.     }
  79.     
  80.     public static void main(String... args) throws IOException {
  81.         BasicClient client = new BasicClient();
  82.         client.connect();
  83.         client.writeMessage(new Message());
  84.         Message msg = client.readMessage();
  85.     }
  86. }
  87.     
  88. 通讯对象 必须实现可序列化,才可以传送对象
    1. import java.io.Serializable;
    2. public class Message implements  implements Serializable {
    3.     private String message;
    4.     public getMessage(String message) {
    5.         return this.message
    6.     }
    7.     public setMessage(String message) {
    8.         this.message = message;
    9.     }
    10. }
    11.     
### Android电脑之间HTTP数据传输 #### 基本概念 HTTP协议是一种应用层协议,采用“请求-响应”模式进行工作。在这种模式下,客户端发起请求,服务端接收并处理请求后返回相应的内容[^4]。 当涉及到Android设备电脑之间的数据交互时,可以通过将其中一方设置为HTTP服务器来实现通信。通常情况下,可以选择在Android设备上运行一个轻量级的HTTP服务器(如Jetty或其他类似的库),或者让电脑充当HTTP服务器,而Android作为客户端向其发送请求[^3]。 #### 实现步骤概述 ##### 设置HTTP Server端 如果决定由计算机担任服务器角色,则可以在该机器上安装任何支持RESTful API的标准Web框架或工具栈;如果是移动终端负责提供服务,则推荐利用Java语言内置的功能或者是第三方开源项目构建简易版的服务程序实例[^3]。 例如,在Android端部署简单的HttpServer可参照如下伪代码片段: ```java import org.eclipse.jetty.server.Server; import org.eclipse.jetty.servlet.ServletContextHandler; public class SimpleHttpServer { public static void main(String[] args) throws Exception { int port = 8080; // 设定监听端口号 Server server = new Server(port); ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); context.setContextPath("/"); server.setHandler(context); // 添加具体的Servlet处理器逻辑... server.start(); server.join(); // 阻塞直到手动停止 } } ``` 此部分展示了如何借助Jetty库快速搭建起可供外部访问的基础型Web Service环境[^3]。 ##### 编写Client端请求代码 另一方面,无论哪边承担起了Service Provider的角色,另一方都需要编写对应的Consumer Application来进行调用操作。下面给出了一段示范性质较强的GET/POST 请求样例: ```java // GET Request Example URL urlForGetRequest = new URL("http://example.com/api/resource"); String readLine = null; HttpURLConnection connection = (HttpURLConnection) urlForGetRequest.openConnection(); connection.setRequestMethod("GET"); int responseCode = connection.getResponseCode(); if(responseCode == HttpURLConnection.HTTP_OK){ BufferedReader in = new BufferedReader( new InputStreamReader(connection.getInputStream())); String result = ""; while((readLine = in.readLine()) != null) result += readLine; } // POST Request Example JSONObject jsonParam = new JSONObject(); jsonParam.put("key", value); URL url = new URL("http://example.com/api/resource"); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); OutputStream os = conn.getOutputStream(); os.write(jsonParam.toString().getBytes()); os.flush(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8")); StringBuilder response = new StringBuilder(); String line ; while ((line = br.readLine())!=null) { response.append(line.trim()); } System.out.println(response.toString()); ``` 以上两段分别代表了最普遍使用的两种类型的网络通讯形式——获取资源信息(GET卡)以及提交表单数据(POST)[^4]. #### 注意事项 1. **安全性考量**: 对于开放公网接口的情况特别要注意身份验证机制的设计,防止未授权用户的非法入侵行为. 2. **性能优化建议**: 根据实际应用场景调整超时时间参数设定、启用缓存策略减少重复计算开销等措施提升整体效率表现. 3. **错误恢复能力增强**: 加入异常捕获分支路径设计以便更好地应对各种不可预见状况的发生. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值