# 计算机网络通信大作业
**Repository Path**: selina_dev/http-comm
## Basic Information
- **Project Name**: 计算机网络通信大作业
- **Description**: 详见readme
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-06-18
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 计算机网络与通信大作业实验报告
## 项目代码
https://gitee.com/piamen/http-comm
## 实现环境
### 服务器端
本实验中,服务器运行在Ubuntu18.04下,采用Tomcat-9.0.36作为服务器软件,通过花生壳内网穿透实现公网访问。
服务器应用程序使用Java语言,借助Servlet技术编写,搭配mysql-5.7.30数据库实现数据存取功能。
### 客户端
本实验采用TTGO模块作为客户端,乐鑫生产的ESP32模块可以进行WIFI通信,TTGO模块在集成ESP32的基础上,增加了一块显示屏,方便调试与结果显示。
TTGO客户端使用C++语言,在Arduino IDE环境中编程,实现POST请求。
## 实现过程
### 服务器端实现
服务器端的环境要响应发送数据的POST请求并将数据存储至服务器端,同时要响应读取数据的POST请求,并将数据返回。
1. 环境配置
Tomcat是基于Java编写的服务器软件,而且后续编写服务器应用程序也需要Java编译环境,所以本实验首先进行了Java环境的安装与变量的配置。紧接着安装了Tomcat以及mysql。
2. 创建mysql数据表
使用root账户登入,输入
```sql
>> CREATE TABLE `students` (
`id` int NOT NULL COMMENT '学生学号',
`name` char(20) NOT NULL DEFAULT '' COMMENT '学生姓名',
`time` BIGINT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`time`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
```
3. 编写服务器应用程序
本Servlet服务器应用程序未使用IDE生成编写,而是手动进行工程的配置。
Tomcat的Servlet工程的基本目录如下
└── WEB-INF
├── classes
└── web.xml
其中,web.xml文件是用于配置该服务器应用程序的,classes目录下存放编译好的class文件,java源文件最好新建src目录存放,不过因为本实验是手动配置项目,为了便于编译命令的编写,将java文件和class文件都存放在classes目录下。
web.xml中,有关配置如下
```xml
Show
Show
Send
Send
Show
/Show
Send
/Send
```
java核心代码如下:
SqlUtil.java
```java
public class SqlUtil {
public void Insert(Student student);
public Student[] Query();
}
```
Send.java
```java
String name = request.getParameter("name");
String id = request.getParameter("id");
SqlUtil sqlUtil = new SqlUtil();
sqlUtil.Insert(new Student(Integer.parseInt(id), name, new Long((long)-1)));
```
Show.java
```java
Student[] students = sqlUtil.Query();
for (int i = 0; i < students.length; i++)
{
out.println("姓名: " + students[i].getName() + " ");
out.println("学号: " + students[i].getId()+ "
");
}
```
4. 运行服务器
终端中,运行以下命令
```sh
/usr/local/tomcat/apache-tomcat-9.0.36/bin$ sudo ./startup.sh
```
5. 花生壳映射
服务器中,运行以下命令
```sh
$ ifconfig
```
记录IP地址
在另一台电脑中运行Windows下的花生壳软件,输入刚才的IP地址以及对应的端口,打开映射。
至此,服务器端准备完成。
### 客户端实现
核心代码
```C++
String data = "name=严霜&id=1120172019";
int length = data.length();
String postRequest =
(String)("POST ") + "/"+"homework/Send"+" HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: Keep Alive\r\n" +
"Content-Length: " + length + "\r\n" +
"Accept: */*\r\n" +
"Origin: http://"+host+"\r\n" +
"Upgrade-Insecure-Requests: 1"+"\r\n" +
"Content-Type: application/x-www-form-urlencoded;" + "\r\n" +
"User-Agent: zyzandESP8266\r\n" +
"Accept-Encoding: gzip, deflate"+"\r\n" +
"Accept-Language: zh-CN,zh;q=0.9"+"\r\n" +
"\r\n" +
data + "\r\n";
client.connect(host, 80));
client.print(postRequest);
```
## 实验结果
在Arduino环境中编写代码,烧录进TTGO中,观察串口监视器。
串口监视器输出
```
.WIFI Connected
IP Address:192.168.31.73
尝试访问服务器
访问成功
POST /homework/Send HTTP/1.1
Host: 18608f8u76.iok.la
Connection: Keep Alive
Content-Length: 25
Accept: */*
Origin: http://18608f8u76.iok.la
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded;
User-Agent: ESP32
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
name=严霜&id=1120172019
Response:
>>HTTP/1.1 200
>>Content-Length: 43
>>Date: Thu, 18 Jun 2020 06:44:13 GMT
>>
>>You put name: 严霜
>>You put ID: 1120172019
>>
```
通过浏览器访问http://18608f8u76.iok.la/homework/Show,得到如下结果

(其中部分为测试数据)
## 附
发送地址:http://18608f8u76.iok.la/homework/Send
显示地址:http://18608f8u76.iok.la/homework/Show