JAVA實現(xiàn)簡單HTTP服務(wù)器

學(xué)習(xí)用Java模擬完成一個簡單的HTTP服務(wù)器,加深對HTTP服務(wù)過程的理解。


Socket

客戶端套接字(也可以就叫“套接字”),套接字是兩臺機器之間的通信端點,是源IP地址和目的IP地址以及源端口號和目的端口號的組合,一般用于標(biāo)識客戶端請求的服務(wù)器和服務(wù),是支持TCP/IP的網(wǎng)絡(luò)通信的基本操作單元。

一個Socket由一個IP地址和一個端口號唯一確定。在Java環(huán)境下,Socket編程主要是指基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程。具體的介紹參考Oracle的Socket說明文檔

使用Socket的過程有:

  • 創(chuàng)建
Socket client = new Socket("127.0.0.1.", 8080);
  • 打開連接到Socket的輸入/輸出流
BufferedReader input=new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedReader output=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
  • 進行讀/寫操作
String line = input.readLine();
output.write("Success!");
output.flush();
  • 關(guān)閉Socket
input.close();
output.close();
client.close();

ServerSocket

服務(wù)器套接字,可以綁定到指定的服務(wù)器IP地址和端口,等待請求通過網(wǎng)絡(luò)傳入,基于該請求執(zhí)行某些操作,然后可能向請求者返回結(jié)果。具體的介紹參考Oracle的ServerSocket說明文檔

  • 這里綁定8080端口,默認(rèn)綁定本地IP地址,偵聽并接收HTTP請求。
ServerSocket server = new ServerSocket(8080);
  • accept()方法,偵聽并接受到此套接字的連接。
Socket socket = server.accept();

Server接收消息后再對請求做處理,注意服務(wù)端input對應(yīng)客戶端的output,服務(wù)端的output對應(yīng)客戶端的input。


示例

package service.com;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

import org.apache.commons.lang3.time.DateFormatUtils;

public class HttpServer {
    
    public static void main(String[] args) {
        
        try {
            // 偵聽8080端口
            ServerSocket server = new ServerSocket(8080);
            
            System.out.println("Info:Server start," + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
            while (1 == 1) {
                // 接收客戶端請求數(shù)據(jù)
                Socket socket = server.accept();
            
                // 讀取
                BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                // 寫入
                BufferedWriter output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                
                String line = input.readLine();
                
                while (line != null) {
                    System.out.println(line);
                    output.write("Success!!" + DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss") + "\r\n");
                    output.flush();
                    line = input.readLine();
                    return;
                }
                //必須關(guān)閉
                input.close();
                output.close();
                
                socket.close();
            }
        } catch (IOException e) {
           System.out.println("Error binding the specified port.");
        }
    }
}

測試

  • 啟動程序后,控制臺信息輸出:
Info:Server start,2016-12-02 15:26:13
  • 在瀏覽器地址欄輸入:
http://127.0.0.1:8080

瀏覽器頁面展示:

Success!!2016-12-02 15:29:01

控制臺輸出:

GET / HTTP/1.1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容