自定义HTTP服务器
关键:遵循HTTP协议
HTTP请求:
- 首行: [方法] + [url] + [版本]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个ContentLength属性来标识Body的长度;
HTTP响应
- 首行: [版本号] + [状态码] + [状态码解释]
- Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束
- Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个ContentLength属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中.
具体代码
package tcp;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 根据uri内容不同
* 返回不同的信息
* 404 找不到内容
* 200返回“你好”
*/
public class MyHTTP {
private static final int port = 9003;
public static void main(String[] args) throws IOException {
//创建服务器
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("服务器已启动!");
//等待客户端连接
Socket socket = serverSocket.accept();
//构建读写对象
try (BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))
) {
//从客户端拿信息
//得到首行信息
String firstLine = reader.readLine();//只读取一行
String[] firstLineArr = firstLine.split(" ");//按空格分隔成数组
//method
String method = firstLineArr[0];
//uri
String uri = firstLineArr[1];
//HTTPVersion
String version = firstLineArr[2];
//输出首行信息
System.out.println(String.format("首行信息->方法:%s,URI:%s,HTTP版本号:%s", method, uri, version));
//创建返回内容
String content = "";
if (uri.contains("404")) {
content = "<h1>页面未找到</h1>";
} else if (uri.contains("200")) {
content = "<h1>你好,龙 gie gie</h1>";
}
//内容输出
//首行信息
//这里的输出格式一定要严格遵循HTTP响应格式
writer.write(String.format("%s 200 ok", version) + "\n");
//head
//content-type和content-length别忘了添加 “-”;
writer.write("Content-Type:text/html;charset=utf-8\n");
//content是字符,这里要是字节的长度
writer.write("Content-Length:" + content.getBytes().length + "\n");
//空行
writer.write("\n");//不能省略
writer.write(content);
writer.flush();
}
}
}
然后在idea上运行
然后打开浏览器:
输入以下内容:
http://127.0.0.1:9003/404
IP+端口号+状态码
访问得到如下界面
- 修改状态码为 200
我的博客有点好,就是三连有点少。
各位看官,一键三连一下喽!!!