实现一个简单的Web服务器非常容易,使用ServerSocket在服务器端监听端口并等待浏览器请求,一旦接收到浏览器数据后就开始解析Http协议,最后将服务器端请求处理完后通过Socket返回给浏览器即可。
V1版本,我们先实现一个简单的读取服务器静态文件的功能,在后续版逐渐完善。
BinCatServerV1实现代码:
package com.anbai.sec.server;import java.io.*;import java.net.ServerSocket;import java.net.Socket;import java.util.logging.Logger;/*** ServerSocket示例*/public class BinCatServerV1 {private static final Logger LOG = Logger.getLogger("info");public static void main(String[] args) {try {// 设置服务监听端口int port = 8080;// 设置服务名称String serverName = "BinCat-0.0.1";// 创建ServerSocket,监听本地端口ServerSocket ss = new ServerSocket(port);LOG.info(serverName + " 启动成功,监听端口: " + port);while (true) {// 等待客户端连接Socket socket = ss.accept();try {// 获取Socket输入流对象InputStream in = socket.getInputStream();// 获取Socket输出流对象OutputStream out = socket.getOutputStream();// 创建输出流对象BufferedReader br = new BufferedReader(new InputStreamReader(in));// 从Socket中读取一行数据String str = br.readLine();if (str == null) {continue;}// 切割请求Http协议信息String[] strs = str.split("\\s+");// 解析Http请求URL地址String url = strs[1];// 输出服务器返回信息String msg = "";// 当前服务器运行目录下的文件File file = new File(System.getProperty("user.dir"), url);if (file.exists()) {out.write("HTTP/1.1 200 OK\n".getBytes());msg = file.getAbsolutePath();} else {out.write("HTTP/1.1 404 Not Found\n".getBytes());msg = file.getAbsolutePath() + " Not Found!";}// 输出返回字节数out.write(("Content-Length: " + msg.getBytes().length + "\n").getBytes());// 写入换行out.write("\n".getBytes());// 将读取到的数据写入到客户端Socketout.write(msg.getBytes());in.close();out.close();} catch (IOException e) {LOG.info("处理客户端请求异常:" + e);} finally {socket.close();}}} catch (IOException e) {e.printStackTrace();}}}
启动BinCat服务后控制台将输出:
九月 09, 2020 5:18:50 下午 com.anbai.sec.server.BinCatServerV1 main信息: BinCat-0.0.1启动成功,监听端口:8080
浏览器请求localhost:8080即可在浏览器中输出当前请求的文件是否存在:
请求一个不存在的文件地址,浏览器将会输出错误信息,如请求localhost:8080/test:
从上图中我们可以看到响应的状态码和body都能够正确的被浏览器解析。
Back
