前言
在開始這個之前,我想 應該先把HTTP看一下,請求格式和響應格式之類的。
Socket是分UDP和TCP兩種連接方式的(TCP和UDP的區別:TCP有狀態連接,TCP的三次握手,TCP不丟包,佔用資源多;UDP無狀態連接,丟包,速度快,佔用資源少。實際生活中TCP的應用場景:HTTP,FTP,SMTP,UDP的應用:微信,小視頻等)
請求步驟(客戶端)
- 通過host和port創建socket連接
- 獲取socket中的輸出流,往輸出流中寫入請求數據
- 獲取socket中的輸入流,讀取輸入流中的響應數據
響應步驟(服務端)
- 建立監聽端口,等待TCP連接請求
- 獲取socket中的輸入流,讀取輸入流中的請求數據
- 獲取socket中的輸出流,往輸出流中寫入響應數據
總結
客戶端和服務端就是通過socket中的輸入輸出流來進行通訊的。
客戶端代碼
package com.my.test.web;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* @author lf
* @Title: MyHttpClient
* @Description: java socket 客戶端
* @date 2019/4/1 14:52
*/
public class MyHttpClient {
public static void main(String[] args) throws Exception{
String uri = "index.html";
doGet("127.0.0.1",8080,uri);
}
private static void doGet(String host, int port, String uri) throws Exception{
//1.建立socket連接
Socket socket = new Socket(host, port);
//2.從socket中獲取輸出流 寫入請求數據
StringBuffer requsetInfo = new StringBuffer();
requsetInfo.append("GET "+uri+" HTTP/1.1\r\n");//請求第一行
requsetInfo.append("Accept: */*\r\n");//請求頭信息
/*
* requestInfo.append(.....);
* */
OutputStream socketOut = socket.getOutputStream();
socketOut.write(requsetInfo.toString().getBytes());
//3.從socket中獲取輸入流 讀取響應數據
InputStream socketIn = socket.getInputStream();
int size = socketIn.available();
byte[] buffer = new byte[size];
socketIn.read(buffer);
String responseStr = new String(buffer);
}
}
服務端代碼
package com.my.test.web;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author lf
* @Title: MyHttpServer
* @Description: java socket http服務端
* @date 2019/4/1 14:35
*/
public class MyHttpServer {
public static void main(String[] args) throws Exception{
int port = 8080;
//1.監聽8080端口
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("服務器正在監聽"+port+"端口,等待客戶端請求");
//2.等待客戶連接
while (true){
Socket socket = serverSocket.accept();
System.out.println("客戶端和服務建立了連接!客戶端的ip是:"+socket.getInetAddress());
//3.處理請求
service(socket);
}
}
/**
* @Description: 處理請求
* @author lf
* @date 2019/4/1 14:42
*/
private static void service(Socket socket) throws Exception{
//獲取輸入流 從輸入流中讀取請求數據
InputStream socketIn = socket.getInputStream();
int size = socketIn.available();
byte[] buffer = new byte[size];
socketIn.read(buffer);
String requsetStr = new String(buffer);
/*
* 解析請求中的數據和請求的資源
* */
//
OutputStream socketOut = socket.getOutputStream();
String responseFirstLine = "HTTP/1.1 200 OK\r\n";
String responseHeader = "Content-Type:text\\html";
socketOut.write(responseFirstLine.getBytes());
socketOut.write(responseHeader.getBytes());
//關閉套接字
socket.close();
}
}