实现功能
思路
- 启动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);
}