实现功能

思路

  • 启动Socket服务,循环接收浏览器请求
  • 接收到请求之后,将流中的数据取出
  • 判断目标资源是否存在,若不存在,返回404
  • 若存在,将目标资源通过输出流响应给客户端 类
  • Server:开启Socket 服务
  • Request:封装请求,处理请求的相关业务.
  • Response:封装响应,处理响应的相关业务
  • Test:测试类

代码实现

Server

首先是server功能, 创建一个端口并能接受浏览器请求

public class Server {  
    // 服务器端口  
    private static int port = 8080;  
  
    public void receiving() {  
  
        try {  
            ServerSocket serverSocket = new ServerSocket(port);  
            while(true) {  
                Socket socket = serverSocket.accept();  
                System.out.println(socket);  
            }  
  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
}

接着开始取出请求内容, 通过IO数据流, InputStream 接受, OutputStream 输出。

InputStream inputStream = socket.getInputStream();  
System.out.println(inputStream);

1 一次访问有多个请求是因为没有给回应, 故浏览器会多次请求。 接受到之后, 怎么解析内容就利用 Request 类。

Request

解析的话首先从Server中传入IO流, 然后直接转化为字符串输出即可。

// server 中新增
while (true) {  
    // 获取链接对象  
    Socket socket = serverSocket.accept();  
    System.out.println(socket);  
    InputStream inputStream = socket.getInputStream();  
    System.out.println(inputStream);  
    Request request = new Request(inputStream);    // 这两行
    request.parse();  
}
 
 
public class Request {  
    private InputStream inputStream;  
  
    public Request(InputStream inputStream) {  
        this.inputStream = inputStream;  
    }  
  
    public void parse() {  
        try {  
            byte[] bytes = new byte[1024];  
            inputStream.read(bytes);  
            String string = new String(bytes);  
            System.out.println(string);  
  
        } catch (IOException e) {  
            throw new RuntimeException(e);  
        }  
    }  
}

此时输出就会输出封包头部head: 接下来进行字符串截取, 把GET后的地址取出来, 显然该地址由两个空格包裹, 可以通过 String.getIndex来获取前两个空格的位置, 再用String.subString(index1+1,index2)来得到字串。

private String getUrl(String request) {  
    int index1 = request.indexOf(' ');  
    int index2 = request.indexOf(' ', index1 + 1);  
    return request.substring(index1 + 1, index2);  
}

成功获取

小技巧

自动定义变量

输入 10.val 回车
生成 int i = 10;
 
例如:
new ServerSocket(port).var
ServerSocket serverSocket = new ServerSocket(port);

快速输出

inputStream.sout == System.out.println(inputStream);

快速对某行加异常处理

inputStream.read(bytes);.try
结果
try {  
    inputStream.read(bytes);  
} catch (IOException e) {  
    throw new RuntimeException(e);  
}