国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C#中使用Socket請求Web服務(wù)器過程

2019-11-17 02:58:27
字體:
供稿:網(wǎng)友

C#中使用Socket請求Web服務(wù)器過程

2014-08-14 15:31 by xiaozhi_5638, ... 閱讀, ... 評論, 收藏, 編輯

最開始我們需要明白一件事情,因?yàn)檫@是這篇文章的前提:

HTTP協(xié)議只是一個(gè)應(yīng)用層協(xié)議,它底層是通過TCP進(jìn)行傳輸數(shù)據(jù)的。因此,瀏覽器訪問Web服務(wù)器的過程必須先有“連接建立”的發(fā)生。

而有人或許會問:眾所周知,HTTP協(xié)議有兩大特性,一個(gè)是“無連接”性,一個(gè)是“無狀態(tài)”性。這里的“無連接”豈不是跟上面的說法有沖突?其實(shí)這里并沒有矛盾,只是人們對“連接”這個(gè)詞的理解有差異。首先我們來看一下瀏覽器向Web服務(wù)器發(fā)出Http請求以及Web服務(wù)器給瀏覽器回復(fù)的過程:

  1. 瀏覽器創(chuàng)建Socket,按給定ip(域名)和端口(默認(rèn)為80)連接服務(wù)器。比如使用類似Socket.Connect()、Socket.BeginConnect()等方法;
  2. 連接成功后,瀏覽器依據(jù)HTTP協(xié)議規(guī)范(關(guān)于協(xié)議,后面有講到),向Web服務(wù)器發(fā)送請求數(shù)據(jù)。比如“請求行”、“請求頭標(biāo)”以及“請求數(shù)據(jù)”等,這里可能使用類似Socket.Send()、Socket.BeginSend()等方法。【關(guān)于HTTP協(xié)議中的請求行、請求頭標(biāo)等請參見http://m.survivalescaperooms.com/riky/archive/2007/04/09/705848.html】
  3. 瀏覽器等待服務(wù)器處理并返回?cái)?shù)據(jù);
  4. Web服務(wù)器端使用Socket.Accept()、Socket.BeginAccept()等方法偵聽到瀏覽器的連接后,便開始接收瀏覽器發(fā)送的數(shù)據(jù)。接收到請求數(shù)據(jù)后,依據(jù)HTTP協(xié)議規(guī)范解析數(shù)據(jù),然后處理,最終將處理結(jié)果(如html文檔)發(fā)回給瀏覽器,這里可能用到類似Socket.Send()、Socket.BeginSend()等方法;
  5. Web服務(wù)器發(fā)送完處理結(jié)果后,關(guān)閉Socket;
  6. 瀏覽器接收Web服務(wù)器發(fā)回的數(shù)據(jù)(如html),將其顯示在瀏覽器UI界面。關(guān)閉socket;
  7. 一次“瀏覽器到Web服務(wù)器”的http請求結(jié)束;
  8. 下一次瀏覽器需要請求Web服務(wù)器,跳轉(zhuǎn)到第1)步循環(huán)開始。

用圖表示以上過程:

圖1

如上圖1所示。瀏覽器向Web服務(wù)器發(fā)送http請求之前,需要先建立連接。沒錯(cuò),它們間建立連接的過程跟我們平時(shí)開發(fā)socket程序類似。由此可知,HTTP協(xié)議的“無連接”特性并不是指:瀏覽器與Web服務(wù)器進(jìn)行數(shù)據(jù)交換時(shí),不需要建立連接。那么“無連接”特性到底指什么呢?我們再看圖1會發(fā)現(xiàn),瀏覽器每次請求完畢后都會與服務(wù)器處于“斷開”狀態(tài),下一次請求時(shí)再重新與服務(wù)器建立連接。HTTP的無連接特性恰恰就是指瀏覽器的每次請求都必須重新與服務(wù)器建立連接,正常情況下,瀏覽器不會與Web服務(wù)器保持長時(shí)間的連接狀態(tài)。現(xiàn)將HTTP協(xié)議的兩大特性歸結(jié)如下:

  • 無連接:

服務(wù)器與瀏覽器之間的一次連接只處理一個(gè)http請求,請求處理結(jié)束后,連接斷開。下一次請求再重新建立連接。

  • 無狀態(tài):

服務(wù)器不會保存瀏覽器信息。也就是說,在服務(wù)器端,第一次http請求處理的結(jié)果不會保留到第二次請求。如果第二次請求處理時(shí),需要用到第一次請求處理的結(jié)果,瀏覽器在第二次請求時(shí),必須將第一次處理結(jié)果重新傳回給Web服務(wù)器(比如使用cookie)。

關(guān)于“協(xié)議”:

這個(gè)話題有點(diǎn)大,不是我能掌控得了的。不過對于今天這篇文章,我還是盡最大可能說一點(diǎn)。計(jì)算機(jī)中協(xié)議范疇廣泛,單就網(wǎng)絡(luò)通信中的協(xié)議,就不計(jì)其數(shù),OSI七層中每層都很多種協(xié)議。那么協(xié)議到底本質(zhì)上是個(gè)什么東西呢?單就通信中的協(xié)議來講,協(xié)議的本質(zhì)其實(shí)就是一種數(shù)據(jù)結(jié)構(gòu),類似代碼中的結(jié)構(gòu)體,說得再底層一點(diǎn),就是一個(gè)字節(jié)流,規(guī)定好了第一個(gè)字節(jié)代表什么、第二個(gè)字節(jié)代表什么等等。

協(xié)議的作用跟我們平時(shí)所說的“契約”、“約定”類似,一個(gè)團(tuán)隊(duì)合作的任務(wù),合作各方必須同時(shí)遵守事先的約定,最后工作才能正常進(jìn)行下去。網(wǎng)絡(luò)通信中也一樣,通信雙方收/發(fā)數(shù)據(jù)時(shí)必須按照實(shí)現(xiàn)規(guī)定好了的結(jié)構(gòu)去發(fā)送/接收,一方不遵守該規(guī)范,通信就不能成功。這里說的結(jié)構(gòu)規(guī)范其實(shí)就是“協(xié)議”。協(xié)議有以下作用:

  • 既然是規(guī)范,那么按照規(guī)范做事,自己做的別人更容易理解,便于交流;
  • 將規(guī)范寫成文檔,提供給其他人,方便后期他人擴(kuò)展。因?yàn)橹灰懒送ㄐ乓?guī)范,那么很容易就可以編寫出擴(kuò)展模塊與原有系統(tǒng)協(xié)調(diào)工作。
  • 計(jì)算機(jī)網(wǎng)絡(luò)通信中,有些因素決定了我們必須按照規(guī)定的格式收發(fā)數(shù)據(jù),比如TCP通信中,由于數(shù)據(jù)是按照“流”式傳輸?shù)模绻覀兪孪炔欢x數(shù)據(jù)傳輸規(guī)范,那么很難判斷TCP傳輸?shù)臄?shù)據(jù)邊界。

就網(wǎng)絡(luò)通信協(xié)議來講,應(yīng)用層協(xié)議與我們程序開發(fā)最為密切(至少對我們使用c#、java的人來講),其他向tcp、udp等傳輸層協(xié)議幾乎用不到。我們開發(fā)的通信程序,必須遵守實(shí)現(xiàn)定義好了的應(yīng)用層協(xié)議,比如瀏覽器和Web服務(wù)器都遵守了HTTP應(yīng)用層協(xié)議,只有這樣,它們才能正常交互。倘若我們自己開發(fā)一個(gè)程序,正確地遵守了HTTP協(xié)議,那么我們的程序也能夠像Chrome、IE等瀏覽器一樣,去訪問Web服務(wù)器。

文章末尾有一個(gè)使用socket模擬瀏覽器請求Web服務(wù)器的demo,實(shí)現(xiàn)的功能我們完全可以使用類似WebClient、WebRequest等類型去實(shí)現(xiàn)。demo功能如下:

  • 使用Socket連接Web服務(wù)器(任意);
  • 按照HTTP協(xié)議格式發(fā)送HTTP請求(使用Socket.Send方法);
  • 按照HTTP協(xié)議格式解析Web服務(wù)器返回的數(shù)據(jù)(其實(shí)就顯示在了UI界面)

(開發(fā)這樣的程序需要我們充分熟悉socket編程、HTTP協(xié)議格式)

以下是發(fā)送HTTP請求的代碼:

 1  /// <summary> 2         /// 發(fā)送請求 3         /// </summary> 4         /// <param name="socket"></param> 5         PRivate void SendRequest(Socket socket) 6         { 7             string h1 = "GET " + _path + " HTTP/1.1/r/n"; 8             string h2 = "Accept: */*/r/n"; 9             string h3 = "Accept-Language: zh-cn/r/n";10             string h4 = "Host: " + _host + "/r/n";11             string h5 = "User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36/r/n";12             string h7 = "Connection: close/r/n/r/n";13 14             byte[] send_buffer = Encoding.UTF8.GetBytes(h1 + h2 + h3 + h4 + h5 + h7);15             socket.Send(send_buffer);16             Print("請求發(fā)送完畢,等待Web Server回復(fù)...");17             socket.BeginReceive(_buffer, 0, 640 * 1024, SocketFlags.None, new AsyncCallback(OnReceive), socket);18         }
View Code

下面是效果圖:

圖2

源碼下載:http://files.VEVb.com/xiaozhi_5638/socket_browser.rar


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 静海县| 新津县| 南宁市| 漯河市| 丹东市| 于都县| 胶南市| 景谷| 乐山市| 休宁县| 苏州市| 夏邑县| 香港| 沁源县| 海丰县| 成安县| 雷州市| 永善县| 乌拉特中旗| 高雄市| 墨脱县| 凤冈县| 普兰县| 张家界市| 石棉县| 黔江区| 通化县| 吐鲁番市| 卓尼县| 石城县| 海安县| 康马县| 西充县| 墨脱县| 娱乐| 商都县| 高青县| 丰城市| 建始县| 江陵县| 夏邑县|