網(wǎng)站首頁 編程語言 正文
你需要了解基本Java網(wǎng)絡(luò)編程知識。
HTTP請求組成部分
? 1. 請求行
? ? ?請求行包含三塊內(nèi)容,分別是 GET[請求方式] /[請求URL路徑] HTTP/1.1[HTTP協(xié)議及版本]
? 2. 請求頭
? ? ?第二行開始,格式為key: value形式
? ? ?常見的HTTP請求頭有:
? ? ?Host: 表示請求的主機名
? ? ?User-Agent: 瀏覽器版本,例如Chrome瀏覽器的標識類似Mozilla/5.0 ...Chrome/79,IE瀏覽器的標識類似Mozilla/5.0 (Windows NT ...)like Gecko;
? ? ?Accept:表示瀏覽器能接收的資源類型,如text/*,image/*或者*/*表示所有;
? ? ?Accept-Language:表示瀏覽器偏好的語言,服務(wù)器可以據(jù)此返回不同語言的網(wǎng)頁;
? ? ?Accept-Encoding:表示瀏覽器可以支持的壓縮類型,例如gzip, deflate等。
? 3. 請求體
? ? ?有一空行隔開? ? ?post請求方式時,瀏覽器傳輸?shù)臄?shù)據(jù)(表單數(shù)據(jù))
HTTP響應(yīng)組成部分
響應(yīng)數(shù)據(jù)包:
-
響應(yīng)行
包含三塊內(nèi)容,分別是 HTTP/1.1[HTTP協(xié)議及版本] 200[響應(yīng)狀態(tài)碼] ok[狀態(tài)碼的描述]
-
響應(yīng)頭
第二行開始,格式為key:value形式
常見的HTTP響應(yīng)頭有:
Content-Type:表示該響應(yīng)內(nèi)容的類型,例如text/html,image/jpeg;
Content-Length:表示該響應(yīng)內(nèi)容的長度(字節(jié)數(shù));
Content-Encoding:表示該響應(yīng)壓縮算法,例如gzip;
Cache-Control:指示客戶端應(yīng)如何緩存,例如max-age=300表示可以最多緩存300秒
????????3.響應(yīng)體
????????最后一部分。存放響應(yīng)數(shù)據(jù)
? ? ? ? 可以存放html格式數(shù)據(jù),<html>...</html>這部分內(nèi)容就是響應(yīng)體,它和響應(yīng)頭之間有一個空行隔開。
HTTP常見響應(yīng)碼
關(guān)于響應(yīng)狀態(tài)碼,我們先主要認識三個狀態(tài)碼,其余的等后期用到了再去掌握:
-
200 ok 客戶端請求成功
-
404 Not Found 請求資源不存在
-
500 Internal Server Error 服務(wù)端發(fā)生不可預期的錯誤
好了,我們可以基于java套接字實現(xiàn)一個簡單的HTTP服務(wù)器了。
/*
自定義服務(wù)器
*/
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8080); // 監(jiān)聽指定端口
System.out.println("server is running...");
while (true){
Socket sock = ss.accept();
System.out.println("connected from " + sock.getRemoteSocketAddress());
Thread t = new Handler(sock);
t.start();
}
}
}
class Handler extends Thread {
Socket sock;
public Handler(Socket sock) {
this.sock = sock;
}
public void run() {
try (InputStream input = this.sock.getInputStream()) {
try (OutputStream output = this.sock.getOutputStream()) {
handle(input, output);
}
} catch (Exception e) {;
try {
this.sock.close();
} catch (IOException ioe) {
}
System.out.println("client disconnected.");
}
}
private void handle(InputStream input, OutputStream output) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(input, StandardCharsets.UTF_8));
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8));
// 讀取HTTP請求:
boolean requestOk = false;
String first = reader.readLine();
if (first.startsWith("GET / HTTP/1.")) {
requestOk = true;
}
for (;;) {
String header = reader.readLine();
if (header.isEmpty()) { // 讀取到空行時, HTTP Header讀取完畢
break;
}
System.out.println(header);
}
System.out.println(requestOk ? "Response OK" : "Response Error");
if (!requestOk) {
// 發(fā)送錯誤響應(yīng):
writer.write("HTTP/1.0 404 Not Found\r\n");
writer.write("Content-Length: 0\r\n");
writer.write("\r\n");
writer.flush();
} else {
// 發(fā)送成功響應(yīng):
//讀取html文件,轉(zhuǎn)換為字符串
BufferedReader br = new BufferedReader(new FileReader("http/html/a.html"));
StringBuilder data = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null){
data.append(line);
}
br.close();
int length = data.toString().getBytes(StandardCharsets.UTF_8).length;
writer.write("HTTP/1.1 200 OK\r\n");
writer.write("Connection: keep-alive\r\n");
writer.write("Content-Type: text/html\r\n");
writer.write("Content-Length: " + length + "\r\n");
writer.write("\r\n"); // 空行標識Header和Body的分隔
writer.write(data.toString());
writer.flush();
}
}
}
原文鏈接:https://blog.csdn.net/m0_67338583/article/details/125919153
相關(guān)推薦
- 2024-07-13 ERROR: org.apache.hadoop.hbase.ipc.ServerNotRunnin
- 2022-08-11 C++簡明講解缺省參數(shù)與函數(shù)重載的用法_C 語言
- 2022-04-10 關(guān)于C#中GUI編程的標準事件問題_C#教程
- 2023-11-26 StringBuffer 和 StringBuilder
- 2022-05-15 Python?matplotlib?seaborn繪圖教程詳解_python
- 2022-04-11 python進程結(jié)束后端口占用問題解析_python
- 2022-05-29 C#使用DirectX.DirectSound播放語音_C#教程
- 2022-05-21 DaemonSet服務(wù)守護進程的使用場景_服務(wù)器其它
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支