javaWeb學習之旅1-java socket編程(請求和響應原理)

前言

在開始這個之前,我想 應該先把HTTP看一下,請求格式和響應格式之類的。
Socket是分UDP和TCP兩種連接方式的(TCP和UDP的區別:TCP有狀態連接,TCP的三次握手,TCP不丟包,佔用資源多;UDP無狀態連接,丟包,速度快,佔用資源少。實際生活中TCP的應用場景:HTTP,FTP,SMTP,UDP的應用:微信,小視頻等)

請求步驟(客戶端)

  1. 通過host和port創建socket連接
  2. 獲取socket中的輸出流,往輸出流中寫入請求數據
  3. 獲取socket中的輸入流,讀取輸入流中的響應數據

響應步驟(服務端)

  1. 建立監聽端口,等待TCP連接請求
  2. 獲取socket中的輸入流,讀取輸入流中的請求數據
  3. 獲取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();
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章