首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

04-HTTP-响应数据格式(java7的try-with-resources及实现一个简单的jav...

在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方法。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OlXBzHSuzq-SvTG8vmmOCyew0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券