我们现在要实现一个最基本的功能,使游览器能够访问到我们的服务器。
这次我们实现的功能比较简单,我们的自己写的代码像Tomcat那样在8080端口进行监听,游览器访问时,我们可以输出http请求的信息,并且以http响应的方式返回一句话。
流程大致为:
- 使用网络编程在8080端口进行循环监听
- 当游览器访问时建立连接
- 利用I/O编程输出http请求的信息
- 设置http响应
- 通过I/O编程向游览器回送数据
- 关闭流,断开连接。
代码实现
首先先创建一个ServerScoket在8080端口进行循环监听,下面仅展示核心代码
//得到ServerSocket,在8080端口进行监听
ServerSocket serverSocket = new ServerSocket(8080);
while (!serverSocket.isClosed()) {
}
等待访问,然后进行连接
//等待连接
Socket socket = serverSocket.accept();
得到输入流,并且转成字符输入流进行按行读取展示
//得到输入流
InputStream inputStream = socket.getInputStream();
//将字节输入流转为字符输入流。并将编码设置为utf-8
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line = null;
//循环读取
System.out.println("3:开始读取内容");
while ((line = bufferedReader.readLine()) != null) {
//如果为空就结束读取
if (line.length() == 0) break;
System.out.println(line);
}
设置响应头,响应体,然后获取输出流进行返回
//得到输出流
OutputStream outputStream = socket.getOutputStream();
//设置响应头
String responseHead = "HTTP/1.1 200\r\n" +
"Content-Type: text/html;charset=utf-8\r\n\r\n";
//设置响应体
String responseBody = "这是我自己写的Tomcat";
//http响应消息内容
String response = responseHead + responseBody;
//写回数据
outputStream.write(response.getBytes());
最后关闭流,断开连接
//关闭流
outputStream.close();
inputStream.close();
socket.close();
完整代码如下
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
public class MyTomcat01 {
public static void main(String[] args) {
try {
//得到ServerSocket,在8080端口进行监听
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("---------服务器启动成功----------");
while (!serverSocket.isClosed()) {
System.out.println("-------------------------------------------------");
System.out.println("1:等待连接");
//等待连接
Socket socket = serverSocket.accept();
System.out.println("2:连接成功");
//得到输入流
InputStream inputStream = socket.getInputStream();
//将字节输入流转为字符输入流。并将编码设置为utf-8
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(inputStream, StandardCharsets.UTF_8));
String line = null;
//循环读取
System.out.println("3:开始读取内容");
while ((line = bufferedReader.readLine()) != null) {
//如果为空就结束读取
if (line.length() == 0) break;
System.out.println(line);
}
System.out.println("4:读取内容结束");
//得到输出流
OutputStream outputStream = socket.getOutputStream();
//设置响应头
String responseHead = "HTTP/1.1 200\r\n" +
"Content-Type: text/html;charset=utf-8\r\n\r\n";
//设置响应体
String responseBody = "这是我自己写的Tomcat";
//http响应消息内容
String response = responseHead + responseBody;
//写回数据
outputStream.write(response.getBytes());
System.out.println("5:响应成功");
//关闭流
outputStream.close();
inputStream.close();
socket.close();
System.out.println("6:本次连接结束,正常关闭socket");
System.out.println("-------------------------------------------------\n");
}
} catch (IOException e) {
System.out.println("服务器启动失败");
}
}
}
测试
我们运行程序后使用游览器(Firefox)访问localhost/8080,抓包进行查看,内容如下
这是原始的http请求,我们再查看控制台输出的内容是不是和上面一样,控制台输出的如下
发现是一样的,说明我们的代码请求部分没有问题了,接下来我们看一下页面的显示情况,以及抓包看一下响应的部分。
页面显示
响应头
发现页面和我们想象的一样,响应头也和我们设置的一样,到此,我们的游览器和服务器之间的基本通信就打通了,后面功能我们慢慢实现!!!