国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Http服務器實現文件上傳與下載(一)

網絡
大家都知道web編程的協議就是http協議,稱為超文本傳輸協議。在J2EE中我們可以很快的實現一個Web工程,但在C++中就不是非常的迅速,原因無非就是底層的socket網絡編寫需要自己完成,上層的http協議需要我們自己完成,用戶接口需要我們自己完成,如何高效和設計一個框架都是非常困難的一件事情。

一、引言

大家都知道web編程的協議就是http協議,稱為超文本傳輸協議。在J2EE中我們可以很快的實現一個Web工程,但在C++中就不是非常的迅速,原因無非就是底層的socket網絡編寫需要自己完成,上層的http協議需要我們自己完成,用戶接口需要我們自己完成,如何高效和設計一個框架都是非常困難的一件事情。但這些事情Java已經在底層為我們封裝好了,而我們僅僅只是在做業務層上的事情吧了。

在本Http服務器實現中,利用C++庫和socket原套接字編程和pthread線程編寫。拒絕使用第三方庫。因為主要是讓大家知道基本的實現方式,除去一些安全、高效等特性,但是不管怎么樣,第三方商業庫的基本原理還是一致的,只是他們對其進行了優化而已。在開始的編寫時,我不會全部的簡介Http的協議的內容,這樣太枯燥了,我僅僅解釋一些下面需要用到的協議字段。

在寫本文的時候,之前也有些迷惑,C++到底能干啥,到網上一搜,無非就是能開發游戲,嵌入式編程,寫服務器等等。接著如果問如何編寫一個服務器的話,那么這些網絡水人又會告訴你,你先把基礎學好,看看什么書,之后你就知道了,我只能呵呵了,在無目的的學習中,盡管看了你也不知道如何寫的,因為盡管你知道一些大概,但是沒有一個人領導你入門,我們還是無法編寫一個我們自己想要的東西,我寫這篇博客主要是做一個小小的敲門磚吧,盡管網上有許多博客,關于如何編寫HTTP服務器的,但是要不是第三方庫acl,要么就是短短的幾行代碼,要么就是加入了微軟的一些C#內容或者MFC,這些在我看來只是一些無關緊要的東西,加入后或許界面上你很舒服,但是大大增加了我們的學習成本,因為這些界面上的代碼改變了我們所知道的程序流程走向,還有一些界面代碼和核心代碼的混合,非常不利于學習。

二、HTTP協議

在大家在瀏覽器的url輸入欄上輸入http://10.1.18.4/doing時。瀏覽器向10.1.18.4服務器80端口的進程發送了如下的一個協議頭,它是一個文本字符串。每行以\r\n結束。表示回車換行。

 

1 GET /doing HTTP/1.1
2 Host: 10.1.18.4
3 User-Agent: Mozilla/5.0 (Windows NT 6.2; rv:40.0) Gecko/20100101 Firefox/40.0
4 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
6 Accept-Encoding: gzip, deflate
7 Referer: http://10.1.18.4/
8 Connection: keep-alive

 

所以知道其實我們發送了一個URL請求,其實被轉化為了一個如上的一些字符串。在這里我簡單的解釋一下這個協議頭表示什么,因為在網上你可以找到非常多的信息來解釋它們。

1)第一行中 GET /doing HTTP1.1 表示請求的方式是GET,URL是/doing ,HTTP協議的版本是1.1

2)第二行中 Host 就是服務器的IP

3)第三行中 User-Agent代表著你使用的是什么瀏覽器在什么系統上運行的。從上本可以這條信息顯示是window上火狐瀏覽器發出的請求頭

4)第四行中Accept代表著該瀏覽器可以接受的信息格式,可以是文本,html,或者應用文件(二進制文件)。其中q代表權重,表示更愿意接受前面的信息。還有一些其他的內容,讀者可以自己百度。

5)以下的一些信息中,沒有什么用到,我就不解釋,看文本意義也大概知道一些信息。詳細的請搜索網絡。

在最重要的是一本請求頭什么時候表示結束呢,那就是一個空行表示結束。其實就是"\r\n"結束。

說了這么多可能大家還是有點迷糊,知道這些那么在程序中又是怎么實現的呢。當初我也迷惑,現在我提出一個最簡單的一種實現,就是直接連接一個字符串即可。在實際實現中我對其進行了分解,但是現在,我解釋為如下編寫程序:

 

1 char *str= "GET /doing HTTP/1.1\r\n\
2 Host: 10.1.18.4\r\n\
3 User-Agent: Mozilla/5.0 (Windows NT 6.2; rv:40.0) Gecko/20100101 Firefox/40.0\r\n\
4 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*//*;q=0.8\r\n\
5 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\r\n\
6 Accept-Encoding: gzip, deflate\r\n\
7 Referer: http://10.1.18.4/\r\n\
8 Connection: keep-alive\r\n\
9 Range: bytes=14584264-\r\n\r\n" ;

 

可能上面的協議內容跟之前的有點不一樣,沒關系,我只是截取了一些內容進行輸入。很簡單就是C語言的char*字符串。在沒一行的的結尾都都有一個'\',表示表示換行輸入,去掉也行,需要把器內容寫到一行上,是C語言語法,不懂的讀者可以自己查閱C語言的字符串。我想說的是在每行的結尾都有一個\r\n。這兩個轉義字符就是代表回車換行。并且在第9行有2個\r\n,最后一個代表著空行,意思是說告訴服務器我的協議頭到此位置。

為什么需要一個空行呢,這里就有一個網絡編程的小小信息。在socket TCP流編程中,比如你調用了write或read函數,內部不是一次性接受或者發送所有的信息。所以當我們發送上述的str的時候,不一定一次全部的發送,那么服務端就不知道什么時候結尾了。所以我們需要HTTP規定以空行作為結尾代表著協議頭的結束。

接下面了來就是我們編寫的服務器接受到這個字符串。并且以空行表示接受到整個協議頭,然后對其進行解析。下面就是解析這段字符串的代碼,在工程中我對其封裝,但是現在我們只要知道實現解析功能即可。

 

1 #include 
2 #include 
3 #include 
4 #include 
5 #include 
6 using namespace std;
7
8 char *str= "GET /download/JBPM4S.tt HTTP/1.1\r\n\
9 Host: 10.1.18.4\r\n\
10 User-Agent: Mozilla/5.0 (Windows NT 6.2; rv:40.0) Gecko/20100101 Firefox/40.0\r\n\
11 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*//*;q=0.8\r\n\
12 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3\r\n\
13 Accept-Encoding: gzip, deflate\r\n\
14 Referer: http:http://10.1.18.4/\r\n\
15 Connection: keep-alive\r\n\
16 Range: bytes=14584264-\r\n\r\n" ;
17
18 string& ltrim(string &str) {
19 string::iterator p = find_if(str.begin(), str.end(), not1(ptr_fun
20 str.erase(str.begin(), p);
21 return str;
22 }
23
24 string& rtrim(string &str) {
25 string::reverse_iterator p = find_if(str.rbegin(), str.rend(), not1(ptr_fun(isspace)));
26 str.erase(p.base(), str.end());
27 return str;
28 }
29
30 string& trim(string &str) {
31 ltrim(rtrim(str));
32 return str;
33 }
34 string getContent(string& str,int start,char c,int &pos){
35 int i=start;
36 int len=str.size();
37 while(i
38 i++;
39 }
40 pos=i;
41 return str.substr(start,i-start);
42 }
43 map
44 int len=strlen(str);
45 vector vs;
46 int i=0;
47 while(i
48 if(str[i]!='\r'){
49 int j=i;
50 while(i
51 i++;
52 vs.push_back(string(str+j,str+i));
53 }else{
54 i+=2;
55 }
56 }
57 int pos;
58 string method=getContent(vs[0],0,' ',pos);
59 string url=getContent(vs[0],method.size()+1,' ',pos);
60 map
61 mp["Method"]=method;
62 mp["Url"]=url;
63 for(int i=1;i
64 string key=getContent(vs[i],0,':',pos);
65 string value=vs[i].substr(pos+1);
66 mp[key]=trim(value);
67 }
68 return mp;
69 }
70
71 int main(int argc, char **argv)
72 {
73 map
74 for(map
75 cout<
76 }
77 return 0;
78 }

 

把一些信息解析都放到了一個map里面。這里的解析是先處理每一行,然后再對每一行進行解析。可能這樣的處理方式有點慢,但是沒什么關系,原因是字符串反正比較短,在大并發下效率不會影響太大,如果大家有什么更好的解析方式,可以回復我。

在服務端解析頭信息后,我們可以得到/doing這個url,這樣我們服務請就可以把客戶端需要的內容返回給客戶端了,這里就有瀏覽器請求的內容是否合法是否存在這些信息。就要在相應的響應頭中說明,在《Http服務器實現文件上傳與下載(二)》中會進行說明。

歡迎大家一起探討這些問題。有什么想法的人給我回復,我們一起學習,一起進步哦。

責任編輯:何妍 來源: 博客園
相關推薦

2015-10-10 16:46:14

HTTP網絡協議文件傳輸

2015-10-09 09:41:24

HTTP網絡協議文件傳輸

2015-10-08 09:38:24

HTTP網絡協議文件傳輸

2015-09-29 09:25:20

HTTP網絡協議

2020-12-02 11:48:05

TFTP

2019-04-23 10:48:55

HTTPTomcat服務器

2019-04-24 15:06:37

Http服務器協議

2018-10-09 09:28:12

HTTPHTTP協作服務器

2011-08-18 16:03:34

iPhone上傳圖片

2022-03-01 20:33:50

服務web項目

2020-06-17 21:39:11

HTTP協議服務器

2024-01-08 08:36:29

HTTPGo代理服務器

2010-05-25 13:20:46

http與svn

2017-11-10 08:58:49

Web服務器應用程序

2009-07-03 13:05:47

JSP HTTP服務器

2009-07-06 17:25:22

JSP HTTP服務器

2018-06-15 10:25:43

Python HTTPFTP服務器

2018-12-06 09:23:33

2010-03-22 12:57:46

Java Socket

2018-01-19 10:30:48

HTTP服務器代碼
點贊
收藏

51CTO技術棧公眾號

日韩大片在线播放| 久久久久久亚洲精品不卡4k岛国| 男女激情片在线观看| 国产一区二区女| 麻豆av一区二区| 国产主播精品| 国产精品久久久久9999| 国产毛片久久久| 欧美成人激情视频免费观看| 欧美aaa视频| 亚洲人成自拍网站| 在线观看的黄色| 亚洲美女视频网| 玛雅亚洲电影| 亚洲欧洲国产伦综合| 欧美aa在线| 亚洲丝袜av一区| 欧美美女被草| 久久夜色撩人精品| 亚洲一区网址| 午夜精品一区二区三区在线视频 | 国产一二区在线| 欧美日韩亚洲不卡| 国产高清一区二区三区视频| 欧美成人综合网站| av在线播放免费| 日韩欧美国产麻豆| 手机av在线| 日韩一区av在线| 日韩一级淫片| 国产成人精品av在线| 亚洲a一区二区三区| 欧美国产视频在线观看| 日本不卡视频在线观看| 亚洲精品久久久久久久蜜桃臀| 久久久午夜电影| 石原莉奈一区二区三区高清在线| 色综合久久久久久久久久久| av激情在线| 色噜噜狠狠色综合网图区| 天堂俺去俺来也www久久婷婷| 91在线无精精品一区二区| 石原莉奈一区二区三区在线观看| 天堂av在线中文| 亚洲天堂成人网| 国产乱视频在线观看| 精品久久久久久久久久久久包黑料| 另类激情视频| 欧美中文字幕在线观看| 一区久久精品| 欧美精品一区二区三区三州| 国产精品天天看| 啊v视频在线| 亚洲美女在线视频| 亚洲va久久| 日韩欧美精品久久| 中文字幕欧美一区| 怡红院在线播放| 久久久久久久久91| 欧美午夜不卡| 99热久久这里只有精品| 亚洲成年人网站在线观看| 日日夜夜天天综合入口| 午夜精品久久久久久久久久久久| 国产免费成人| 成人免费视频网站在线看| 91.com在线观看| 91久久精品无嫩草影院| 久久99精品久久久久久秒播放器 | 亚洲欧美综合网| 在线h片观看| 97在线免费观看| 蜜臀精品久久久久久蜜臀| 99爱视频在线观看| 亚洲精品成人久久电影| 成人一区而且| 国产老熟妇精品观看| 欧美日韩中文精品| 亚洲三区欧美一区国产二区| 精品欧美国产| 最新日韩av在线| 三上悠亚亚洲一区| 成人综合色站| 欧美经典一区二区| 成人影院av| 精品综合久久久| 亚洲丝袜另类动漫二区| 视频在线日韩| 欧美日韩综合另类| 午夜欧美视频在线观看| 日韩成人在线看| 裸体裸乳免费看| 欧美日韩成人高清| 波多野结衣在线观看一区二区| 国产老熟妇精品观看| 欧美α欧美αv大片| 日韩中文字幕高清在线观看| www.爱色av.com| 日韩精品中文字幕久久臀| 亚洲日韩成人| 日韩三级电影网| 国产精品久久二区| 国产精品福利一区| 日韩精品视频中文字幕| 人人妻人人澡人人爽欧美一区双| 日韩免费视频一区| 国产色综合网| 国产免费av在线| 成人免费大片黄在线播放| 亚洲精品自拍动漫在线| 97青娱国产盛宴精品视频| 99精品在线免费视频| 国产一区二区三区丝袜| 韩国一区二区三区| 国产伦理精品| 免费观看黄色的网站| 亚洲成人黄色在线| 麻豆成人91精品二区三区| 亚洲羞羞网站| 欧美精品一区二区三区在线看午夜 | 精品国免费一区二区三区| 日本韩国欧美超级黄在线观看| 在线视频不卡一区二区| 91精品欧美福利在线观看| 亚洲激情五月| 最新理论片影院| 青青草99啪国产免费| 成人欧美一区二区三区1314| 国产精品久久久久av蜜臀| 日本新janpanese乱熟| 麻豆国产va免费精品高清在线| jvid福利写真一区二区三区| 素人啪啪色综合| 欧美成人一区二区在线观看| 亚洲最新av网址| bt7086福利一区国产| 国产亚洲欧美日韩精品一区二区三区| 一本二本三本亚洲码| 亚洲欧美国产日韩天堂区| 精品在线播放午夜| 日本精品不卡| 久久精品一区二| 91精品国产免费久久久久久| 亚洲桃色在线一区| 成人羞羞视频在线看网址| 午夜在线网站| 久久国产欧美精品| 亚洲国产91色在线| 成人午夜免费电影| 福利片一区二区| 嫩草嫩草嫩草| 国内外成人免费视频| 精品美女被调教视频大全网站| 精品一区在线看| 日韩一级视频| 国产字幕中文| 成人资源av| 日韩精品中文在线观看| 久久久精品一品道一区| 精品精品久久| 国产三区在线观看| 五十路熟女丰满大屁股| 午夜精品99久久免费| 一本色道久久加勒比精品| 日欧美一区二区| 99er精品视频| 粉嫩tv在线播放| 就去色蜜桃综合| 在线播放国产一区中文字幕剧情欧美| 久久久精品日韩欧美| 成人直播大秀| 黄色视屏免费在线观看| 欧美a v在线播放| 国产欧美日韩中文字幕| 精品人伦一区二区色婷婷| 久久婷婷成人综合色| 亚洲成av人片乱码色午夜| 2020国产在线| 国产字幕中文| 中文字幕日韩精品一区二区| 色在人av网站天堂精品| 日本道在线观看一区二区| 成人综合在线观看| 亚洲成人一区| 亚洲国产天堂| 国产三区四区在线观看| www.亚洲成人网| 成人免费在线网址| 日韩视频在线免费观看| 欧美性色aⅴ视频一区日韩精品| 99九九99九九九视频精品| 欧美日韩调教| 99精品美女视频在线观看热舞| 校园春色综合| 日韩av资源在线| 狠狠色伊人亚洲综合网站色| 久热精品视频在线观看一区| 91精品国产综合久久精品性色| 亚洲人精品午夜| 成人免费视频caoporn|