初識(shí)http
a、超文本傳輸 、應(yīng)用層的面向?qū)ο蟮膮f(xié)議,概念介紹網(wǎng)上資源一大堆,關(guān)鍵是基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)。
b、一開始接觸web項(xiàng)目,都是先接觸的servlet,tomcat服務(wù)器默認(rèn)實(shí)現(xiàn)的一套http規(guī)范,提供了基礎(chǔ)服務(wù)和組件環(huán)境,直接拿到請(qǐng)求、構(gòu)建正文、響應(yīng)客戶端
然而一個(gè)http請(qǐng)求包含:
第一行:請(qǐng)求方式(get、post、put、delete)+“空格”+URI+“空格”+http協(xié)議版本(0.9、1.0、1.1) eg:GET /hello.html HTTP/1.1
第二行:我們熟悉的請(qǐng)求頭Request Head(請(qǐng)求類型、語言、代理、字符集)
http響應(yīng):
第一行:http協(xié)議版本+“空格”+狀態(tài)碼+”空格“+描述 eg:HTTP/1.1 200 OK
第二行:Response Head(包含Content-Type等)
第三行:響應(yīng)正文(一般html)
形象化的了解以上結(jié)構(gòu),打開熟知的瀏覽器
構(gòu)建http server
現(xiàn)在我們由java代碼運(yùn)用ServerSocket tcp協(xié)議模擬構(gòu)建一個(gè)http服務(wù):
public class HttpServer {
public static final int DEFAULT_PORT =8080;//默認(rèn)8080端口
public static void start(){
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(DEFAULT_PORT);
System.out.println("服務(wù)器端正在監(jiān)聽端口:"+serverSocket.getLocalPort());
while(true){//死循環(huán)時(shí)刻監(jiān)聽客戶端鏈接
final Socket socket = serverSocket.accept();
System.out.println("建立了與客戶端一個(gè)新的tcp連接,客戶端地址為:"+socket.getInetAddress()
+":"+socket.getPort());
//開始服務(wù)
service(socket);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void service(Socket socket) throws Exception {
//讀取HTTP請(qǐng)求信息
InputStream socketIn = socket.getInputStream();
Thread.sleep(500);
int size = socketIn.available();
byte[] b = new byte[size];
socketIn.read(b);
String request = new String(b);
System.out.println(request);
//解析請(qǐng)求方式、uri、協(xié)議,獲取uri
String typeUriHttp = request.substring(0,request.indexOf("\r\n"));
String uri = typeUriHttp.split(" ")[1];
//簡(jiǎn)化處理響應(yīng)頭content-Type
String contentType;
if(uri.indexOf("html")!=-1||uri.indexOf("htm")!=-1){
contentType = "text/html";
}else if(uri.indexOf("jpg")!=-1||uri.indexOf("jpeg")!=-1){
contentType = "image/jpeg";
}else if(uri.indexOf("gif")!=-1){
contentType = "image/gif";
}else contentType = "application/octet-stream";
//創(chuàng)建HTTP響應(yīng)結(jié)果
//創(chuàng)建響應(yīng)協(xié)議、狀態(tài)
String httpStatus = "HTTP/1.1 200 OK\r\n";
//創(chuàng)建響應(yīng)頭
String responseHeader = "Content-Type:" + contentType + "\r\n\r\n";
InputStream in = HttpServer.class.getResourceAsStream("/webRoot"+uri);
OutputStream socketOut = socket.getOutputStream();
//發(fā)送響應(yīng)協(xié)議、狀態(tài)碼及響應(yīng)頭、正文
socketOut.write(httpStatus.getBytes());
socketOut.write(responseHeader.getBytes());
int len =0;
b = new byte[1024];
while((len=in.read(b))!=-1){
socketOut.write(b,0,len);
}
Thread.sleep(1000);
//socket.close();
}
}
?寫一個(gè)測(cè)試類,主方法啟動(dòng)服務(wù)
package Http;
/**
* Author:varCode
* Date:2019-03-22 20:55
* Description:<描述>
*/
public class HttpTest {
public static void main(String[] args) {
//開啟Http服務(wù)端
HttpServer.start();
}
}
在我們項(xiàng)目目錄的webRoot文件夾下放入可訪問的資源,通過瀏覽器URI(資源定位符)讀取服務(wù)端資源,打開我們的瀏覽器,本地ip+默認(rèn)端口
脫離tomcat服務(wù)環(huán)境的一個(gè)web訪問頁面,是有點(diǎn)小意思啊,下面我們?cè)賮砻撾x客戶端瀏覽器
構(gòu)建http client
package Http;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* Author:varCode
* Date:2019-03-22 22:20
* Description:<描述>
*/
public class HttpClient {
//實(shí)現(xiàn)get方式訪問http server
public static void doGet(String host,int port,String uri){
Socket socket = null;
try {
socket = new Socket(host,port);
//創(chuàng)建http請(qǐng)求 第一行 注意空格
StringBuffer sb = new StringBuffer("GET "+uri+" HTTP/1.1\r\n");
//構(gòu)建請(qǐng)求頭
sb.append("Accept: */*\r\n");
sb.append("Accept-Language: zh-cn\r\n");
sb.append("Accept-Encoding: gzip, deflate\r\n");
sb.append("User-Agent: HTTPClient\r\n");
sb.append("Host: localhost:8080\r\n");
sb.append("Connection: Keep-Alive\r\n");
//發(fā)送http請(qǐng)求
OutputStream socketOut = socket.getOutputStream();
socketOut.write(sb.toString().getBytes());
Thread.sleep(2000);
InputStream socketIn = socket.getInputStream();
int size = socketIn.available();
byte[] b = new byte[size];
socketIn.read(b);
//將相應(yīng)結(jié)果輸出到控制臺(tái) 模擬瀏覽器界面
System.out.println(new String(b));
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
?再來一個(gè)客戶端測(cè)試類:要先啟動(dòng)上述的HttpTest服務(wù)測(cè)試類,再運(yùn)行下面客戶端主程序測(cè)試:
package Http;
/**
* Author:varCode
* Date:2019-03-22 22:41
* Description:<描述>
*/
public class ClientTest {
public static void main(String[] args) {
//客戶端發(fā)請(qǐng)求
HttpClient.doGet("localhost",8080,"/weather.html");
}
}
且將控制臺(tái)當(dāng)作頁面打印如下:
文章來源:http://www.zghlxwxcb.cn/news/detail-496085.html
好了,至此完全可以由HttpClient客戶端類——>HttpServer服務(wù)類上請(qǐng)求及響應(yīng),可以由瀏覽器——>HttpServer發(fā)送請(qǐng)求(上面已經(jīng)測(cè)試了),HttpClient——>tomcat來相應(yīng)請(qǐng)求(有興趣的可以自己來,tcp協(xié)議只能監(jiān)聽一個(gè)端口的主機(jī)服務(wù),開啟tomcat,關(guān)閉HttpServer測(cè)試類)
瀏覽器和tomcat都是實(shí)現(xiàn)了http規(guī)范,都能解析請(qǐng)求和構(gòu)建響應(yīng),更何況tomcat還是java編寫的服務(wù)器?文章來源地址http://www.zghlxwxcb.cn/news/detail-496085.html
到了這里,關(guān)于java代碼構(gòu)建簡(jiǎn)單http服務(wù)器和客戶端的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!