HTTP服务器
http协议的底层是tcp/ip协议,浏览器与服务器的交互就是tcp的通信过程。所以我们可以使用先前学的tcp通讯知识点搭建一个简单的服务器。
思路
- 使用ServerSocket创建一个服务器端(指定端口为8888),阻塞式接受tcp请求(accept()方法)
- 从浏览器访问:http://localhost:8888 就能与服务器端建立连接
- 建立了连接相当于tcp连接建立完成,可以使用Socket client = x.accept() 创建浏览器端的socket
- 创建输入流获取浏览器传入的信息(请求信息)
- 创建输出流返回响应信息,响应信息格式是固定的,一旦写错,浏览器无法接收响应信息
- 归纳如下:
public static void main(String[] args) { //创建服务器 //阻塞式接受 //创建输入流 //读取请求 //创建输出流 //返回响应 //响应头 //响应内容 }
代码
必读注意事项,响应头必须不能写错:
- HTTP/1.1 200 OK 缺少此行无法响应,200是状态码,表示响应成功
- Date:日期
- Server:服务器名称等信息
- Content-type:text/html;charset=utf-8 //不写charset=utf-8会导致浏览器解读乱码
- Content-length:内容长度,注意就是这一行content-length这两个单词绝对不能写错,一旦写错,无法返回响应
- 这里有回车换行符。缺少此回车换行,同样不能返回响应。
- 响应数据中不包含响应内容也无法响应
package _20191225_review;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
/**
* 昨天写的Server真的是云里雾里,今天再来写一次,先面向流程的吧
* @author TEDU
*
*/
public class Server {
public static void main(String[] args) throws IOException {
//创建服务器
ServerSocket server = new ServerSocket(8888);
//阻塞式接受
Socket client = server.accept();
//创建输入流
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
//读取请求
char[] requestInfo = new char[1024*10];
int len = br.read(requestInfo);
System.out.println(new String(requestInfo));
//创建输出流
OutputStream is = client.getOutputStream();
//返回响应
//响应内容
StringBuilder content = new StringBuilder();
content.append("<html>");
content.append("<head>");
content.append("<title>");
content.append("响应成功");
content.append("</title>");
content.append("</head>");
content.append("<body>");
content.append("响应成功了熊");
content.append("</body>");
content.append("</html>");
//响应头:用StringBuilder来存储
StringBuilder responseInfo = new StringBuilder();
/*
响应行:HTTP/1.1 200 OK
Date:日期
Server:服务器名称等信息
Content-type:text/html
Content-length:
*/
String CRLF = "
";
int size = content.toString().getBytes().length;
responseInfo.append("HTTP/1.1 200 OK").append(CRLF);//不添加响应行无法响应!!!!!!!!!!!!!!!!!!
responseInfo.append("Date:").append(new Date()).append(CRLF);
responseInfo.append("Server:xiaohei Server/1.0.0").append(CRLF);
responseInfo.append("Content-type:text/html").append(CRLF);
responseInfo.append("Content-length:").append(size).append(CRLF);//这一行写错无法响应!!!!!!!!!!!!!!!!
responseInfo.append(CRLF);//不能缺少的回车换行符!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//将content添加进响应消息中
responseInfo.append(content);//不添加content也无法响应!!!!!!!!!!!!!!!!!!!!!!!!
is.write(responseInfo.toString().getBytes());
is.flush();
}
}