目標(biāo):更好的理解 Apache杈抢、Tomcat 等軟件的工作模式
之前做web應(yīng)用一直是在本地裝個(gè)Apache、Tomcat之類的軟件肉瓦,然后把做好的網(wǎng)頁(yè)文件放在他們的工作目錄下(如Apache的htdocs)脱篙,然后打開瀏覽器輸入127.0.0.1或localhost就可以直接訪問(wèn)了,好神奇除破,可是為什么,怎么實(shí)現(xiàn)的呢琼腔,早就知道有Socket(套接字)這個(gè)東西瑰枫,可之前就是沒有把這兩方面結(jié)合起來(lái),今天我們就一起來(lái)看一看這究竟是為什么丹莲。
先看下Http請(qǐng)求命令長(zhǎng)啥樣:
- 服務(wù)器代碼
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(80);
System.out.println("正在等待情書中...");
Socket socket = serverSocket.accept();
System.out.println("收到情書光坝,我要開始解析!");
String line3 = "";
InputStream inputStream3 = socket.getInputStream();
BufferedReader reader3 = new BufferedReader(new InputStreamReader(inputStream3));
while ( (line3 = reader3.readLine()) != null ){
System.out.println(line3);
}
} catch (Exception e) {
e.printStackTrace();
}
}
- 客戶端訪問(wèn)
瀏覽器輸入:http://127.0.0.1/html/index3.html
服務(wù)端的打印結(jié)果如下圖:
注意看第一行:
GET /html/index3.html HTTP/1.1- 方法為GET
- 請(qǐng)求的文件為/html/index3.html
- Http 版本為1.1
服務(wù)器最終代碼
public static void main(String[] args) {
// TODO Auto-generated method stub
String base_url = "C:/Users/Administrator/Downloads/";
while(true){
try {
ServerSocket serverSocket = new ServerSocket(80);
System.out.println("正在等待情書中...");
Socket socket = serverSocket.accept();
System.out.println("收到情書甥材,我要開始解析盯另!");
//得到想訪問(wèn)的文件名
InputStream inputStream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = reader.readLine();
String url = line.substring(5, line.indexOf("HTTP") - 1);
//生成輸出流
FileInputStream fileInputStream = new FileInputStream(base_url + url);
OutputStream outputStream = socket.getOutputStream();
byte[] buffer = new byte[4 * 1024];
int len = 0;
while ((len = fileInputStream.read(buffer)) >0) {
outputStream.write(buffer, 0, len);
}
outputStream.flush();
serverSocket.close();
fileInputStream.close();
inputStream.close();
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:socket 要正常關(guān)閉,不然會(huì)出現(xiàn)異常洲赵。
服務(wù)器的目錄如下:
根目錄
html目錄
多媒體目錄
這樣便可進(jìn)行Http的訪問(wèn)了,
- 訪問(wèn)Html 文件
瀏覽器輸入 http://127.0.0.1/html/index3.html - 訪問(wèn)視頻文件
瀏覽器輸入http://127.0.0.1/media/Shakira-LaLaLa.mp4 - 訪問(wèn)圖片文件
瀏覽器輸入 http://127.0.0.1/media/gif7.gif - 訪問(wèn)音頻文件
瀏覽器輸入 http://127.0.0.1/media/Button47.wav
邊角料( 轉(zhuǎn) )
Q:什么是端口鸳惯?
A:這是一個(gè)比較抽象的概念,是為了進(jìn)程間通信叠萍,每一個(gè)進(jìn)程只能占用一個(gè)端口芝发,也就是說(shuō)多個(gè)進(jìn)程絕不能同時(shí)占用一個(gè)端口Q:既然多個(gè)進(jìn)程不能同時(shí)占用一個(gè)端口,那么咱們常說(shuō)的web服務(wù)默認(rèn)使用的是80端口俭令,我電腦有三個(gè)瀏覽器后德,谷歌,360抄腔,IE他們卻可以同時(shí)上網(wǎng)瓢湃,這不是端口沖突了嗎?
A:常說(shuō)的web服務(wù)使用80端口指的是服務(wù)器監(jiān)聽web請(qǐng)求的端口赫蛇,是服務(wù)器绵患,不是你自己的客戶機(jī)。一般來(lái)說(shuō)悟耘,一個(gè)應(yīng)用程序打開后訪問(wèn)網(wǎng)絡(luò)本地操作系統(tǒng)為其分配的端口號(hào)是隨機(jī)的落蝙,所以三個(gè)瀏覽器雖然同時(shí)接收web服務(wù)器的回復(fù)報(bào)文,由于他們?nèi)齻€(gè)各自占用的端口不一樣暂幼,所以不會(huì)產(chǎn)生沖突筏勒。Q:非要使用80端口嗎?
A:不一定旺嬉。我們剛才在編程的時(shí)候確實(shí)使用的是80端口管行,所以我們?cè)跒g覽器中輸入127.0.0.1/index.html,瀏覽器會(huì)默認(rèn)認(rèn)為我們會(huì)向127.0.0.1主機(jī)的80號(hào)端口發(fā)送請(qǐng)求邪媳。但是捐顷,這個(gè)80端口號(hào)只是默認(rèn)的而已荡陷,我們完全可以自己改掉,比如在java代碼里把服務(wù)器端的ServerSocket改成 ServerSocket serverSocket = new ServerSocket(3456); 這時(shí)候我們?cè)跒g覽器中就要輸入 127.0.0.1:3456/index.html 了迅涮,效果是一樣的废赞,可以淺嘗輒止一下。Q:誰(shuí)是客戶端叮姑,誰(shuí)是服務(wù)器唉地?
A:咱們只有一臺(tái)電腦,這臺(tái)電腦既充當(dāng)著客戶端的角色戏溺,又充當(dāng)著服務(wù)器的角色渣蜗。當(dāng)瀏覽器請(qǐng)求網(wǎng)頁(yè)時(shí),它是客戶端旷祸;當(dāng)80端口收到請(qǐng)求報(bào)文并應(yīng)答時(shí)耕拷,它就是服務(wù)器。實(shí)在不理解托享,就想想什么是自戀吧