您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
04-HTTP-响应数据格式(java7的try-with-resources及实现一个简单的java版http服务器)
发布时间:2024-11-23 20:13:49编辑:雪饮阅读()
-
在java7开始新增了一个try-with-resources语句。
像是我们打开一个mysql连接,一个文件流诸如此类的资源类型,一般都是要处理关闭的。
我们常规是try catch finally,最后在finally里面写关闭代码,不管try里面处理业务是否发生异常,但打开的文件最终都得关闭。
那么try-with-resources实现自动关闭这些常用的资源类型,使得更加简洁。
那么接下来我们先创建一个基础的maven(我这里连module都不创建,直接一路next)项目。
然后我们在src/main里面建立名如com的package,然后创建一个类如Server.java
我们就以实现一个简单的http服务器为例。
则该java类实现如:
package com;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
/*
自定义服务器
*/
public class Server {
public static void main(String[] args) throws IOException {
// 监听指定端口
ServerSocket ss = new ServerSocket(8080);
System.out.println("server is running...");
//不断的接收前端请求
while (true){
Socket sock = ss.accept();
System.out.println("connected from " + sock.getRemoteSocketAddress());
//得到一个前端请求就开一个子线程去处理
Thread t = new Handler(sock);
t.start();
}
}
}
class Handler extends Thread {
Socket sock;
public Handler(Socket sock) {
this.sock = sock;
}
public void run() {
/*
* 这种在try后面像是参数一样写在小括号的语句被称为try-with-resources语句
* java7提供的这种语法
* 在Java 7及更高版本中,try-with-resources语句提供了一种更简洁、更安全的方式来管理资源。
* 在try关键字后面的括号中声明的资源(实现了AutoCloseable接口的对象,如InputStream、OutputStream等),会在try块执行完毕后自动调用其close()方法。
* 这意味着你不需要在finally块中显式关闭资源,减少了出错的可能性。此外,如果资源在try块中因为异常而提前退出,资源仍然会被正确关闭。
* 总结来说,try-with-resources语句是Java 7引入的一个改进,旨在简化资源管理并减少资源泄露的风险。
* 它要求资源必须实现AutoCloseable接口,而大多数Java标准库中的资源类(如InputStream、OutputStream、FileReader、FileWriter等)都已经实现了这个接口。
* 因此,当你需要管理资源时,应该优先考虑使用try-with-resources语句。
* */
try (InputStream input = this.sock.getInputStream()) {
try (OutputStream output = this.sock.getOutputStream()) {
//那么这里自然就是为了拿到一个前端输入流,和一个后端用于输出的流,然后handle去处理
handle(input, output);
}
} catch (Exception e) {
try {
this.sock.close();
} catch (IOException ioe) {
}
System.out.println("client disconnected.");
}
}
private void handle(InputStream input, OutputStream output) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
// 读取HTTP请求:
boolean requestOk = false;
String first = reader.readLine();
if (first.startsWith("GET / HTTP/1.")) {
requestOk = true;
}
for (;;) {
String header = reader.readLine();
if (header.isEmpty()) { // 读取到空行时, HTTP Header读取完毕
break;
}
System.out.println(header);
}
System.out.println(requestOk ? "Response OK" : "Response Error");
if (!requestOk) {
// 发送错误响应:
writer.write("HTTP/1.0 404 Not Found\r\n");
writer.write("Content-Length: 0\r\n");
writer.write("\r\n");
writer.flush();
} else {
// 发送成功响应:
//读取html文件,转换为字符串
BufferedReader br = new BufferedReader(new FileReader("http/html/a.html"));
StringBuilder data = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null){
data.append(line);
}
br.close();
int length = data.toString().getBytes(StandardCharsets.UTF_8).length;
writer.write("HTTP/1.1 200 OK\r\n");
writer.write("Connection: keep-alive\r\n");
writer.write("Content-Type: text/html\r\n");
writer.write("Content-Length: " + length + "\r\n");
writer.write("\r\n"); // 空行标识Header和Body的分隔
writer.write(data.toString());
writer.flush();
}
}
}
然后我们在项目中src同级建立http/html目录并放置一个如a.html于http/html目录中。
然后运行我们的这个Server.java中的main方法。
我们可以看到这里的示例监听端口是8080.
那么接下来我们访问如http://localhost:8080/
即可得到如下网页
关键字词:java7,try-with-resources,http,java,服务器,简单