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

C#實現Web服務器功能學習經驗總結

開發 后端
這里介紹C#實現Web服務器功能的程序設計,從請求信息中獲取請求類型。如果請求類型是GET,則從請求信息中獲取所訪問的HTML文件名。

學習C#時,經常會遇到Web服務器功能的程序設計問題,這里將介紹C#實現Web服務器功能的程序設計問題的解決方法。

C#實現Web服務器功能的程序設計

根據HTTP協議的作用原理,實現GET請求的Web服務器程序的方法如下:

創建TcpListener類對象,監聽某端口(任意輸入閑置端口 如:8080 )。等待、接受客戶機連接到該端口,得到與客戶機連接的socket;從與socket關聯的輸入流中讀取一行客戶機提交的請求信息,請求信息的格式為:GET 路徑/文件名 HTTP/1.0。從請求信息中獲取請求類型。如果請求類型是GET,則從請求信息中獲取所訪問的HTML文件名。沒有HTML文件名時,則以index.html作為文件名;

如果HTML文件存在,則打開HTML文件,把HTTP頭信息和HTML文件內容通過socket傳回給Web瀏覽器,然后關閉文件。否則發送錯誤信息給Web瀏覽器;關閉與相應Web瀏覽器連接的socket字。

C#實現Web服務器功能的代碼如下:

  1. using System;  
  2. using System.IO;  
  3. using System.Net;  
  4. using System.Net.Sockets;  
  5. using System.Text;  
  6. using System.Threading ;  
  7.  
  8. class MyWebServer  
  9. {  
  10.  
  11. private TcpListener myListener ;  
  12. private int port = 8080 ; // 選者任何閑置端口  
  13.  
  14. //開始兼聽端口  
  15. //同時啟動一個兼聽進程  
  16. public MyWebServer()  
  17. {  
  18. try  
  19. {  
  20. //開始兼聽端口  
  21. myListener = new TcpListener(port) ;  
  22. myListener.Start();  
  23. Console.WriteLine("Web Server Running... Press ^C to Stop...");  
  24. //同時啟動一個兼聽進程 ''StartListen''  
  25. Thread th = new Thread(new ThreadStart(StartListen));  
  26. th.Start() ;  
  27.  
  28. }  
  29. catch(Exception e)  
  30. {  
  31. Console.WriteLine("兼聽端口時發生錯誤 :" +e.ToString());  
  32. }  
  33. }  
  34. public void SendHeader(string sHttpVersion, string sMIMEHeader, 
    int iTotBytes, string sStatusCode, ref Socket mySocket)  
  35. {  
  36.  
  37. String sBuffer = "";  
  38.  
  39. if (sMIMEHeader.Length == 0 )  
  40. {  
  41. sMIMEHeader = "text/html"; // 默認 text/html  
  42. }  
  43.  
  44. sBuffersBuffer = sBuffer + sHttpVersion + sStatusCode + "\r\n";  
  45. sBuffersBuffer = sBuffer + "Server: cx1193719-b\r\n";  
  46. sBuffersBuffer = sBuffer + "Content-Type: " + sMIMEHeader + "\r\n";  
  47. sBuffersBuffer = sBuffer + "Accept-Ranges: bytes\r\n";  
  48. sBuffersBuffer = sBuffer + "Content-Length: " + iTotBytes + "\r\n\r\n";  
  49.  
  50. Byte[] bSendData = Encoding.ASCII.GetBytes(sBuffer);  
  51.  
  52. SendToBrowser( bSendData, ref mySocket);  
  53.  
  54. Console.WriteLine("Total Bytes : " + iTotBytes.ToString());  
  55.  
  56. }  
  57.  
  58. public void SendToBrowser(String sData, ref Socket mySocket)  
  59. {  
  60. SendToBrowser (Encoding.ASCII.GetBytes(sData), ref mySocket);  
  61. }  
  62.  
  63. public void SendToBrowser(Byte[] bSendData, ref Socket mySocket)  
  64. {  
  65. int numBytes = 0;  
  66.  
  67. try  
  68. {  
  69. if (mySocket.Connected)  
  70. {  
  71. if (( numBytes = mySocket.Send(bSendData, bSendData.Length,0)) == -1)  
  72. Console.WriteLine("Socket Error cannot Send Packet");  
  73. else  
  74. {  
  75. Console.WriteLine("No. of bytes send {0}" , numBytes);  
  76. }  
  77. }  
  78. else  
  79. Console.WriteLine("連接失敗....");  
  80. }  
  81. catch (Exception e)  
  82. {  
  83. Console.WriteLine("發生錯誤 : {0} ", e );  
  84.  
  85. }  
  86. }  
  87. public static void Main()  
  88. {  
  89. MyWebServer MWS = new MyWebServer();  
  90. }  
  91. public void StartListen()  
  92. {  
  93.  
  94. int iStartPos = 0;  
  95. String sRequest;  
  96. String sDirName;  
  97. String sRequestedFile;  
  98. String sErrorMessage;  
  99. String sLocalDir;  
  100.  
  101. String sMyWebServerRoot = "E:\\MyWebServerRoot\\"; //設置你的虛擬目錄  
  102.  
  103. String sPhysicalFilePath = "";  
  104. String sFormattedMessage = "";  
  105. String sResponse = "";  
  106.  
  107. while(true)  
  108. {  
  109. //接受新連接  
  110. Socket mySocket = myListener.AcceptSocket() ;  
  111.  
  112. Console.WriteLine ("Socket Type " +mySocket.SocketType );  
  113. if(mySocket.Connected)  
  114. {  
  115. Console.WriteLine("\nClient Connected!!\n=\nCLient IP {0}\n",mySocket.RemoteEndPoint) ;  
  116.  
  117. Byte[] bReceive = new Byte[1024] ;  
  118. int i = mySocket.Receive(bReceive,bReceive.Length,0) ;  
  119.  
  120. //轉換成字符串類型  
  121. string sBuffer = Encoding.ASCII.GetString(bReceive);  
  122.  
  123.  
  124. //只處理"get"請求類型  
  125. if (sBuffer.Substring(0,3) != "GET" )  
  126. {  
  127. Console.WriteLine("只處理get請求類型..");  
  128. mySocket.Close();  
  129. return;  
  130. }  
  131.  
  132. // 查找 "HTTP" 的位置  
  133. iStartPos = sBuffer.IndexOf("HTTP",1);  
  134.  
  135. string sHttpVersion = sBuffer.Substring(iStartPos,8);  
  136.  
  137. // 得到請求類型和文件目錄文件名  
  138. sRequest = sBuffer.Substring(0,iStartPos - 1);  
  139.  
  140. sRequest.Replace("\\","/");  
  141.  
  142. //如果結尾不是文件名也不是以"/"結尾則加"/"  
  143. if ((sRequest.IndexOf(".") <1) && (!sRequest.EndsWith("/")))  
  144. {  
  145. sRequestsRequest = sRequest + "/";  
  146. }  
  147.  
  148. //得帶請求文件名  
  149. iStartPos = sRequest.LastIndexOf("/") + 1;  
  150. sRequestsRequestedFile = sRequest.Substring(iStartPos);  
  151.  
  152. //得到請求文件目錄  
  153. sDirName = sRequest.Substring(sRequest.IndexOf("/"), sRequest.LastIndexOf("/")-3);  
  154.  
  155. //獲取虛擬目錄物理路徑  
  156. sLocalDir = sMyWebServerRoot;  
  157.  
  158. Console.WriteLine("請求文件目錄 : " + sLocalDir);  
  159.  
  160. if (sLocalDir.Length == 0 )  
  161. {  
  162. sErrorMessage = "<H2>Error!! Requested Directory does not exists</H2><Br>";  
  163. SendHeader(sHttpVersion, "", sErrorMessage.Length, " 404 Not Found", ref mySocket);  
  164. SendToBrowser(sErrorMessage, ref mySocket);  
  165. mySocket.Close();  
  166. continue;  
  167. }  
  168.  
  169. if (sRequestedFile.Length == 0 )  
  170. {  
  171. // 取得請求文件名  
  172. sRequestedFile = "index.html";  
  173. }  
  174.  
  175.  
  176. String sMimeType = "text/html";  
  177.  
  178. sPhysicalFilePath = sLocalDir + sRequestedFile;  
  179. Console.WriteLine("請求文件: " + sPhysicalFilePath);  
  180.  
  181. if (File.Exists(sPhysicalFilePath) == false)  
  182. {  
  183.  
  184. sErrorMessage = "<H2>404 Error! File Does Not Exists...</H2>";  
  185. SendHeader(sHttpVersion, "", sErrorMessage.Length, " 404 Not Found", ref mySocket);  
  186. SendToBrowser( sErrorMessage, ref mySocket);  
  187.  
  188. Console.WriteLine(sFormattedMessage);  
  189. }  
  190.  
  191. else  
  192. {  
  193. int iTotBytes=0;  
  194.  
  195. sResponse ="";  
  196.  
  197. FileStream fs = new FileStream(sPhysicalFilePath, 
    FileMode.Open, FileAccess.Read, FileShare.Read);  
  198.  
  199. BinaryReader reader = new BinaryReader(fs);  
  200. byte[] bytes = new byte[fs.Length];  
  201. int read;  
  202. while((read = reader.Read(bytes, 0, bytes.Length)) != 0)  
  203. {  
  204. sResponsesResponse = sResponse + Encoding.ASCII.GetString(bytes,0,read);  
  205.  
  206. iTotBytesiTotBytes = iTotBytes + read;  
  207.  
  208. }  
  209. reader.Close();  
  210. fs.Close();  
  211.  
  212. SendHeader(sHttpVersion, sMimeType, iTotBytes, " 200 OK", ref mySocket);  
  213. SendToBrowser(bytes, ref mySocket);  
  214. //mySocket.Send(bytes, bytes.Length,0);  
  215. }  
  216. mySocket.Close();  
  217. }  
  218. }  
  219. }  
  220. }  

【編輯推薦】

  1. C#創建表單簡單介紹
  2. C#修改DataReader默認行為
  3. C#設置CooperativeLevel概述
  4. C#表單增加控件簡單描述
  5. C# EmployeePlug類概述
責任編輯:佚名 來源: 博客園
相關推薦

2009-08-13 18:13:27

C#學習經驗

2009-08-11 14:20:41

C# .NET學習經驗

2009-09-01 13:10:39

C#讀取Word

2009-08-07 09:47:17

C#枚舉C#數組

2009-09-01 13:00:05

C#實現Windows

2009-08-21 17:42:36

C#調用API

2009-08-24 14:56:01

C#連接Access

2009-08-27 11:21:36

C# override

2009-09-02 14:14:44

C# COM接口轉換

2009-09-18 10:21:13

C#數組C#串操作

2009-09-16 17:13:54

學習Linq

2009-08-27 15:45:30

C#正則表達式

2015-09-30 14:40:47

WebAPI接口設計

2011-07-08 13:15:52

JSP

2011-07-21 13:40:17

java

2010-06-13 13:44:07

UML學習筆記

2013-12-18 15:54:21

2009-08-26 15:39:08

C#隱式類型局部變量

2010-06-02 09:06:26

SVN學習

2009-08-24 17:34:14

C#創建XML Web
點贊
收藏

51CTO技術棧公眾號

日韩啊v在线| 国产精品国产三级国产aⅴ无密码| 天天综合网 天天综合色| 国产乱肥老妇国产一区二 | 成人久久网站| 国产剧情一区二区三区| 久久久久久中文| 中文字幕视频在线观看| 国内精品伊人久久久久影院对白| 欧美性猛交xxxxx免费看| 国产欧美精品一区aⅴ影院| 最新69国产成人精品视频免费| 精品一区视频| 2023亚洲男人天堂| 国产一区99| 久久亚洲国产精品| www.在线播放| 色狠狠色噜噜噜综合网| 欧美精品无码一区二区三区| 国产自产高清不卡| 91精品久久久久久久久青青 | 99高清视频有精品视频| 午夜亚洲精品| 欧美一区午夜精品| 久久一区中文字幕| 日韩电影大全在线观看| 亚洲欧洲日韩| 性欧美精品一区二区三区在线播放| av成人黄色| 久久久久亚洲av无码专区喷水| 亚洲欧美视频| 国产一区二区三区高清| 亚洲精品一二三区区别| 国产综合欧美在线看| 亚洲综合自拍| 涩涩涩999| 久久久久久免费| 在线黄色国产视频| 婷婷成人综合网| 欧美色综合一区二区三区| 欧美性色aⅴ视频一区日韩精品| 国产精品一区二区三区四区色| 欧美三级电影在线观看| 欧美人体视频xxxxx| 亚洲精品动漫100p| 粉嫩一区二区| 欧美国产日本高清在线| 亚洲精品3区| 成人久久18免费网站漫画| 日日夜夜精品免费视频| 国产一区二区网| 亚洲精品亚洲人成人网| 在线观看av中文| 亚洲精品一区二三区不卡| 久久久91麻豆精品国产一区| 国产精品久久久av| 日韩电影免费在线看| 欧美在线观看视频网站| 亚洲一区在线视频观看| av免费在线观看网址| 久久精品小视频| 成人激情开心网| 欧美日韩在线观看一区| 成人av在线资源网站| 手机亚洲第一页| 美乳少妇欧美精品| 亚洲免费黄色| jizzjizzjizz亚洲日本| 91精品视频网| 日本成人小视频| 欧美成人精品免费| 精品视频全国免费看| 日韩欧美激情| 五月天亚洲综合情| 欧美日韩亚洲系列| 日韩欧美久久| 中国黄色录像片| 精品久久国产老人久久综合| 天天揉久久久久亚洲精品| 亚洲 高清 成人 动漫| 日韩精品在线观看视频| 中文字幕免费一区二区三区| 亚洲性生活网站| 亚洲精品影视在线观看| 三级影片在线观看欧美日韩一区二区| 男男互摸gay网站| 午夜美女久久久久爽久久| 丁香啪啪综合成人亚洲小说| 九七久久人人| 一道精品一区二区三区| 欧美老女人在线| 免费人成黄页网站在线一区二区| 人在线成免费视频| 亚洲欧美国产日韩综合| 青青草精品毛片| 欧美三级xxx| 久久亚洲风情| 不卡一区视频| 特黄特黄的视频| 免费日韩av电影| 在线亚洲午夜片av大片| 国产精品国产馆在线真实露脸 | 亚洲欧洲一区二区天堂久久| 国产在线观看a视频| 国产自产在线视频| 国产一区二中文字幕在线看| 精品三级在线观看| 国产精品电影院| 亚洲综合不卡| 欧美黄页免费| 手机福利小视频在线播放| 超碰在线免费观看97| 欧美影院在线播放| 亚洲成av人乱码色午夜| 久久国产精品露脸对白| 免费看a在线观看| 欧美黑人在线观看| 欧亚洲嫩模精品一区三区| 国产一区高清| 91福利免费| 伊人激情综合网| 久久av一区二区三区| 人偷久久久久久久偷女厕| 成人免费a**址| 无遮挡又爽又刺激的视频| 亚洲国产天堂网精品网站| 99国产精品一区| 欧美日韩免费| 手机在线电影一区| 美国成人xxx| 亚洲欧美专区| 日韩视频不卡中文| 日韩精品首页| 在线高清一区| 国产色一区二区| 偷拍一区二区三区| 欧美一级专区免费大片| 亚洲九九九在线观看| 69精品小视频| 国产a级片免费看| 手机福利在线| 小嫩嫩12欧美| 国产成人一区在线| 欧美午夜无遮挡| 欧美精品在线免费观看| 欧美日韩精品一区| 欧美三级午夜理伦三级| 青春草视频在线| 亚洲黄色一区| 日韩一区在线播放| 中文字幕在线精品| 91精品久久久久久久久久入口 | 成人欧美大片| 成人视屏在线观看| 一区二区免费| 国产精品一区二区99| 欧美高清一区| 成人动漫精品一区二区| 亚洲影院在线观看| 欧美一区二区三区男人的天堂| 久久伊人91精品综合网站| 午夜精品一区二区三区视频免费看| 亚洲精品美女久久久| 欧美高清在线精品一区| 久久精品av麻豆的观看方式| 亚洲午夜一区| 日韩午夜小视频| 日本三级福利片| 免费精品一区二区三区在线观看| 99久久久国产精品免费蜜臀| 在线国产精品视频| 精品欧美一区二区在线观看| 亚洲图片欧美色图| 欧洲在线/亚洲| 亚洲毛片av在线| 欧美国产丝袜视频| 亚洲444eee在线观看| 久久婷婷一区二区三区| 欧美日韩国产激情| 亚洲国产成人久久综合| 欧美日韩免费观看一区三区| 日韩免费福利电影在线观看| 欧美精品一区在线播放| 国产美女在线精品免费观看| 日韩视频第二页| 国产三区视频在线观看| 精品一区二区三区亚洲| 日本中文字幕不卡| 国产精品久久久久三级| 神马久久桃色视频| 美日韩免费视频| 国产视频第一区| 午夜视频一区| 香蕉成人伊视频在线观看| xvideos亚洲人网站| 2022中文字幕| 美女福利一区二区三区| 精品一区二区在线播放| 欧美xxxx在线观看| 亚洲欧洲精品一区二区|