模擬http協議所以需要處理請求與封裝響應
之後在服務器端就可以進行使用
創建處理請求類
package com.yunhe;
import java.io.IOException;
import java.io.InputStream;
public class HttpRequest {
private String uri;
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public HttpRequest(InputStream in) throws IOException{
resolverRequest(in);
}
private void resolverRequest(InputStream in) throws IOException {
//1.讀取 客戶端請求過來的數據,解析出來uri
byte[] buff = new byte[1024];
int len = in.read(buff);
if( len>0 ){
String msg = new String(buff,0,len);
System.out.println("客戶端請求信息");
System.out.println("客戶端請求過來的數據是:" + msg );
this.uri = msg.substring( 4,msg.indexOf("HTTP/1.1") );
}else{
System.out.println("bad request!");
}
}
public static void main(String[] args) {
}
}
創建響應類
package com.yunhe;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
public class HttpResponse {
private OutputStream out = null;
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
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);
byte[] buff = new byte[1024];
int len = 0;
StringBuffer sb = new StringBuffer();
//拼湊響應頭信息
sb.append("HTTP/1.1 200 OK\n");
//sb.append("Content-Type: text/html;charset=UTF-8\n");
sb.append("\r\n");
//響應業務,
out.write(sb.toString().getBytes());
while((len=fis.read(buff))!=-1){
out.write(buff,0,len);
}
fis.close();
out.flush();
out.close();
}
}
使用tcp創建服務器端
package com.yunhe;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Server {
static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8888);
System.out.println("啓動服務器....8888端口");
while(true){
Socket s = ss.accept();
System.out.println("客戶端:"+s.getInetAddress().getLocalHost()+"已連接到服務器");
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
HttpRequest request = new HttpRequest( s.getInputStream() );
String requesturi = request.getUri();
System.out.println("請求路徑是:"+requesturi);
HttpResponse response = new HttpResponse(s.getOutputStream());
//if(isStatic(requesturi)){
response.writeFile(requesturi);
//}
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;
}
}