Skip to content

Java-10 项目挑战

Task1.maven

1.什么是maven?

  1. 请你自行上网查阅资料,了解一下什么是maven
  2. 什么是jar包?
  3. maven和jar包有关系吗?有什么关系?
  4. 我们为什么要用maven?

2. 试着下载maven吧!

  • 你的java环境配置好了吗?
  • 别忘了配置环境变量
  • 看看你的maven是什么版本

3.什么是maven仓库?

  1. 怎么配置你自己的本地仓库位置?
  2. 需要的jar包本地仓库没有?让我们去看看远程仓库!
  3. 远程仓库不止一种!你知道中央仓库是什么吗?
  4. 私服又是什么?

4.创建你自己的maven项目!

  1. 你的IDEA关联maven了吗?
  2. 一个maven项目都需要配置什么参数?你能说说看吗?
  3. 你的项目结构是什么样的?你知道你的代码、配置文件、测试代码、测试配置文件、maven项目配置文件都在哪里吗?
  4. pom.xml文件?
    1. 这是什么?
    2. 它有什么用?
    3. 它的基本配置有哪些?
    4. 你能通过这个文件管理你的jar包版本、项目类型吗?
  5. 怎么导入你需要的jar包?去找到答案吧!

5.启动你的maven!

  1. maven的常用命令有哪些你知道吗?
  2. 图形化界面是非常方便的,去观察IDEA中的maven面板,看看可以快速执行哪些maven指令吧!

6.恭喜你~你已经对maven有初步的了解了!现在,向着最终项目进发吧!

Task2.快递取件码查询系统

李华成功通过高考考进了UESTC,开学第一天他发现他的宿舍在校外,如果要拿快递的话要去到校内的菜鸟驿站,比较远。所以他决定手搓一个快递柜,请你帮他编写一个客户端和服务端的程序,实现通过快递单号查询取件码的功能。

知识准备

maven

HTTP(HyperText Transfer Protocol):应用层协议,用于客户端(浏览器/APP)与服务端之间的数据传输。

特点

  • 无状态(每个请求独立,默认不记录历史)
  • 基于请求-响应模型
  • 支持明文(HTTP)和加密(HTTPS)传输

请求报文样例:

http
POST /login HTTP/1.1
Host: api.example.com
Content-Type: application/json
User-Agent: Mozilla/5.0
Content-Length: 45

{"username": "admin", "password": "123456"}
POST /login HTTP/1.1
Host: api.example.com
Content-Type: application/json
User-Agent: Mozilla/5.0
Content-Length: 45

{"username": "admin", "password": "123456"}

响应报文样例:

http
HTTP/1.1 200 OK
Content-Type: application/json
Set-Cookie: sessionid=abc123; Path=/
Content-Length: 30

{"status": "success", "token": "xyz"}
HTTP/1.1 200 OK
Content-Type: application/json
Set-Cookie: sessionid=abc123; Path=/
Content-Length: 30

{"status": "success", "token": "xyz"}

需要了解常见的请求方式,以及常见的响应状态码(404 应该是最熟悉的状态码了)

JSON数据格式

json本质来说就是一个字符串,是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。

类似Java中的HashMap,通过键值的匹配来读取数据

键名必须用双引号包裹,值的类型多种多样,还可以嵌套,例如:

json
{
  "key1": "value1",
  "key2": 123,
  "key3": true,
  "key4": null,
  "key5": { "nestedKey": "nestedValue" },
  "key6": [1, 2, 3]
}
{
  "key1": "value1",
  "key2": 123,
  "key3": true,
  "key4": null,
  "key5": { "nestedKey": "nestedValue" },
  "key6": [1, 2, 3]
}

如果遇到很复杂的json字符串,还可以用这个网站帮助分析结构

JSON Formatter & Validator (curiousconcept.com)

TCP/IP 通信

项目实现

客户端

先要在pom.xml中导入解析json格式的依赖

xml
		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.51</version>
        </dependency>
		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.51</version>
        </dependency>

用fastjson构造json格式

java
//fastjson这个库需要定义一个类作为映射
public class User {
    private String name;
    private int age;
    // 必须有无参构造函数
    // 必须提供 getter/setter (Fastjson 依赖它们)
}
//然后通过给这个类实例化具体数据构建json
User user = new User("Alice", 25);
String json = JSON.toJSONString(user);
// 结果: {"age":25,"name":"Alice"}
//fastjson这个库需要定义一个类作为映射
public class User {
    private String name;
    private int age;
    // 必须有无参构造函数
    // 必须提供 getter/setter (Fastjson 依赖它们)
}
//然后通过给这个类实例化具体数据构建json
User user = new User("Alice", 25);
String json = JSON.toJSONString(user);
// 结果: {"age":25,"name":"Alice"}

解析json格式

java
//{"age":25,"name":"Alice"}
String json = "{\"name\":\"Alice\",\"age\":25}";
User user = JSON.parseObject(json, User.class);
//这时候user这个对象就保存了对应字段的内容
//{"age":25,"name":"Alice"}
String json = "{\"name\":\"Alice\",\"age\":25}";
User user = JSON.parseObject(json, User.class);
//这时候user这个对象就保存了对应字段的内容

代码实现部分

java
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Client {
    private static final String SERVER_URL = "http://localhost:8000/query";

    public static void main(String[] args) {
        while (true) {
            //读取用户输入的快递单号和手机号
            
            
            try {
                /*
                用fastjson这个依赖构造json格式,构造的样例为
                {"trackingNumber":"SF123456789","phone":"19867653558"}
                */
            
                // 将这个json格式的数据写入请求体并发送HTTP POST请求
                

                // 读取响应,状态码是200才是响应成功
                if (connection.getResponseCode() == 200) {
                   /*
                   解析服务端响应的json格式,拿到取件码,拿不到就显示msg的内容
                   样例:
                   例如:{"pick_code":4096,"msg":"success"}
                   		{"pick_code":null,"msg":"手机号不正确"}
                   */
                    
                    
                   }
                } else {
                    System.out.println("查询失败,状态码: " + connection.getResponseCode());
                }
            } catch (IOException e) {
                System.out.println("请求发生错误: " + e.getMessage());
            }
        }

        scanner.close();
        System.out.println("客户端已退出");
    }
}
import java.io.IOException;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class Client {
    private static final String SERVER_URL = "http://localhost:8000/query";

    public static void main(String[] args) {
        while (true) {
            //读取用户输入的快递单号和手机号
            
            
            try {
                /*
                用fastjson这个依赖构造json格式,构造的样例为
                {"trackingNumber":"SF123456789","phone":"19867653558"}
                */
            
                // 将这个json格式的数据写入请求体并发送HTTP POST请求
                

                // 读取响应,状态码是200才是响应成功
                if (connection.getResponseCode() == 200) {
                   /*
                   解析服务端响应的json格式,拿到取件码,拿不到就显示msg的内容
                   样例:
                   例如:{"pick_code":4096,"msg":"success"}
                   		{"pick_code":null,"msg":"手机号不正确"}
                   */
                    
                    
                   }
                } else {
                    System.out.println("查询失败,状态码: " + connection.getResponseCode());
                }
            } catch (IOException e) {
                System.out.println("请求发生错误: " + e.getMessage());
            }
        }

        scanner.close();
        System.out.println("客户端已退出");
    }
}

服务端

java
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Server {
    private static final int PORT = 8000;
    private static final Map<String, String> expressMap = new HashMap<>();

    public static void main(String[] args) throws IOException {
        // 初始化一些测试数据
        initializeExpressData();
        // 创建HTTP服务器,监听指定端口
        HttpServer server = HttpServer.create(new InetSocketAddress(PORT), 0);
        // 设置路由和处理程序
        server.createContext("/query", new QueryHandler());
        // 启动服务器
        server.start();
        System.out.println("Server started on port " + PORT);
    }

    private static void initializeExpressData() {
        // 添加一些测试数据
        //键的构成是  快递单号_手机号
        expressMap.put("SF123456789_13005433678", "1234");
        expressMap.put("JD987654321_19805433168", "5678");
        expressMap.put("YT456789123_13905479698", "9012");
        expressMap.put("ZT789123456_18505433664", "3456");
    }

    static class QueryHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            if ("POST".equals(exchange.getRequestMethod())) {
                // 读取请求体
                

                try {
                    // 解析JSON请求(例如:{"trackingNumber":"SF123456789"})获得单号
                    
                    
                    // 在expressMap中查询取件码,
                    
                    
                    /*
                    构建响应的json
                    例如:{"pick_code":4096,"msg":"success"}
                    如果找不到快递则是{"pick_code":null,"msg":"根据各种情况写提示信息"}
                    */
                    

                    // 发送响应
                    
                } catch (Exception e) {
                    // 处理异常,返回400状态码(Bad Request)
                   
                }
            } else {
                // 非POST请求返回405 Method Not Allowed
                exchange.sendResponseHeaders(405, -1);
            }
        }
    }
}
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Server {
    private static final int PORT = 8000;
    private static final Map<String, String> expressMap = new HashMap<>();

    public static void main(String[] args) throws IOException {
        // 初始化一些测试数据
        initializeExpressData();
        // 创建HTTP服务器,监听指定端口
        HttpServer server = HttpServer.create(new InetSocketAddress(PORT), 0);
        // 设置路由和处理程序
        server.createContext("/query", new QueryHandler());
        // 启动服务器
        server.start();
        System.out.println("Server started on port " + PORT);
    }

    private static void initializeExpressData() {
        // 添加一些测试数据
        //键的构成是  快递单号_手机号
        expressMap.put("SF123456789_13005433678", "1234");
        expressMap.put("JD987654321_19805433168", "5678");
        expressMap.put("YT456789123_13905479698", "9012");
        expressMap.put("ZT789123456_18505433664", "3456");
    }

    static class QueryHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange exchange) throws IOException {
            if ("POST".equals(exchange.getRequestMethod())) {
                // 读取请求体
                

                try {
                    // 解析JSON请求(例如:{"trackingNumber":"SF123456789"})获得单号
                    
                    
                    // 在expressMap中查询取件码,
                    
                    
                    /*
                    构建响应的json
                    例如:{"pick_code":4096,"msg":"success"}
                    如果找不到快递则是{"pick_code":null,"msg":"根据各种情况写提示信息"}
                    */
                    

                    // 发送响应
                    
                } catch (Exception e) {
                    // 处理异常,返回400状态码(Bad Request)
                   
                }
            } else {
                // 非POST请求返回405 Method Not Allowed
                exchange.sendResponseHeaders(405, -1);
            }
        }
    }
}

本题提交方式

提交点这里

出题人联系方式

出题人QQ:1507015236