模拟http协议所以需要处理请求与封装响应
之后在服务器端就可以进行使用
创建处理请求类
package com.zhou;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
public class HttpRequest {
//客户端请求的uri
private String allUri;
//请求的服务uri
private String uri;
//从请求解析的数据
private HashMap<String, String> values=new HashMap<>();
public String getAllUri() {
return allUri;
}
public void setAllUri(String allUri) {
this.allUri = allUri;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public HashMap<String, String> getValues() {
return values;
}
public void setValues(HashMap<String, String> values) {
this.values = values;
}
public HttpRequest(InputStream in) throws IOException{
resolverRequest(in);
}
private void resolverRequest(InputStream in) throws IOException {
//获取输入流中数据
InputStreamReader isr=new InputStreamReader(in);
BufferedReader br=new BufferedReader(isr);
//读取 客户端请求过来的数据,获取请求头解析出来uri
String requestHead=br.readLine();
//包含数据在内的uri
allUri=requestHead.split(" ")[1];
//请求的uri
this.uri=allUri.split("\\?")[0];
//判断请求是否是静态资源不是则解析数据
if(!Server.isStatic(allUri)) {
//数据字符串username=adas&password=11111
String dataStr=allUri.split("\\?")[1];
toMap(dataStr);
}
}
//将字符串数据转换为map
public void toMap(String dataStr) {
String[] split = dataStr.split("&");
for (String string : split) {
String[] data = string.split("=");
values.put(data[0], data[1]);
}
}
@Override
public String toString() {
return "HttpRequest [allUri=" + allUri + ", uri=" + uri + ", values=" + values + "]";
}
}
创建响应类
package com.zhou;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
public class HttpResponse {
// 获取输出流用于响应
private OutputStream out = null;
public HttpResponse(OutputStream out) {
super();
this.out = out;
}
// 这个方法的作用是把请求的地址传递进来,服务器这个时候向客户端回写响应的文件数据等
public void writeFile(String path) throws IOException {
// 获取当前项目路径用于返回当前项目下静态资源
String basepath = new File("").getCanonicalPath();
FileInputStream fis = new FileInputStream(basepath + "/" + path);
StringBuffer sb = new StringBuffer();
// 拼凑响应头信息
sb.append("HTTP/1.1 200 OK\n");
sb.append("\r\n");
byte[] buff = new byte[1024];
int len = 0;
// 响应业务,
out.write(sb.toString().getBytes());
while ((len = fis.read(buff)) != -1) {
out.write(buff, 0, len);
}
fis.close();
out.flush();
out.close();
}
public void exec(HttpRequest request) throws IOException {
System.out.println("请求的服务:"+request.getUri().substring(1));
System.out.println("请求的数据:"+request.getValues());
//通过预先配置将uri与处理的服务绑定
//通过url获取服务 反射执行相应方法进行服务执行
}
}
使用tcp创建服务器端
package com.zhou;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
System.out.println("启动服务器....8888端口");
//阻塞方法获取客户端对象
Socket s = ss.accept();
//创建相应的请求相应对象
HttpRequest request = new HttpRequest( s.getInputStream() );
HttpResponse response = new HttpResponse(s.getOutputStream());
//System.out.println("客户端:"+s.getInetAddress().getLocalHost()+"已连接到服务器");
String requesturi = request.getUri();
System.out.println(request);
//如果请求静态资源直接返回
if(isStatic(requesturi)){
response.writeFile(request.getUri());
}else {
response.exec(request);
}
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//一些静态资源的判断(可以在数组中进行添加)
public static boolean isStatic( String uri ){
boolean isStatic = false;
String []suffixs = {"html","css","js","jpg","png","gif","bmp"};
for( String suffix : suffixs){
if(uri.endsWith("."+suffix)){
isStatic = true;
break;
}
}
return isStatic;
}
}