學(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