TcpListererベースのwebサーバとHttpListererベースのwebサーバ

18708 ワード

『Asp.Net本質論』著者:郝チャンピオン
/*TCPプロトコルに基づくリスナーを簡略化するため、NETはシステムにあります.Net.SocketsネーミングスペースにはTcpListererクラスが用意されており、これを使用すると、コンストラクション関数にネットワークエンドポイント情報のセットを渡すことで、使用するネットワークプロトコルなどの詳細を設定する必要がなくなり、Startメソッドを呼び出した後、リスニング作業が開始されます.AccepttTcpClientメソッドはプロセスをブロックし、クライアントの接続がリスナーに到達することを知っています.このメソッドは、クライアント接続を表すエージェントオブジェクト*/を返します.
 1 class TcpListener_Study

 2 {

 3 public void CreateTcpLister()

 4 {

 5 //     loopback    , 127.0.0.1

 6 IPAddress address = IPAddress.Loopback;

 7 //         ,8974  0          

 8 IPEndPoint endpoint = new IPEndPoint(address, 8974);

 9 

10 TcpListener newserver = new TcpListener(endpoint);

11 newserver.Start();

12 Console.WriteLine("    ,   :{0}", endpoint.Port);

13 while (true)

14 {

15 //       

16 TcpClient newclient = newserver.AcceptTcpClient();

17 Console.WriteLine("     ");

18 //       

19 NetworkStream ns = newclient.GetStream();

20 

21 //

22 byte[] request = new byte[4096];

23 

24 int lentth = ns.Read(request, 0, 4096);

25 

26 string requeststring = Encoding.UTF8.GetString(request, 0, lentth);

27 

28 Console.WriteLine(requeststring);

29 

30 //     

31 string statusLine = "Http/1.1 200 ok \r
"; 32 byte[] statusLineBytes = Encoding.UTF8.GetBytes(statusLine); 33 // 34 string responseBody = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head runat=\"server\"> <title>Socket Study </title></head><body><form id=\"form1\" runat=\"server\"><div>Hello World ,Socket Study </div> </form></body></html>"; 35 byte[] responseBytes = Encoding.UTF8.GetBytes(responseBody); 36 string responseHeader = string.Format("Content-type:text/html; charset=UTF-8 \r
Content-length:{0}\r
", responseBody.Length); 37 byte[] responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader); 38 // 39 ns.Write(statusLineBytes, 0, statusLineBytes.Length); 40 // 41 ns.Write(responseHeaderBytes, 0, statusLineBytes.Length); 42 43 44 ns.Write(new byte[] { 13, 10 },0,2); 45 // 46 ns.Write(responseBytes, 0, statusLineBytes.Length); 47 newclient.Close(); 48 if (Console.KeyAvailable) 49 { 50 break; 51 } 52 newserver.Stop(); 53 } 54 } 55 }





/*httpプロトコルのリスナーをさらに簡略化するため、NetはネーミングスペースSystem.NetにはHttpListenerクラスが提供する、このオブジェクトに伴う.NETは一連の関連*オブジェクトがHTTPをカプセル化した処理を提供する.**/
 
 
 1 class HttpLisener_Study

 2     {

 3         public void CreateHTTPLister()

 4         {

 5             if (!HttpListener.IsSupported)

 6             {

 7                 throw new System.InvalidOperationException("     xp sp2 server03     ");

 8             }

 9             string[] prefixes = new string[] { "http://localhost:8974/" };

10 

11             HttpListener listener = new HttpListener();

12             foreach (string  s in prefixes)

13             {

14 

15                 listener.Prefixes.Add(s);

16             }

17             listener.Start();

18             Console.WriteLine("   ");

19             while (true)

20             {

21                 //

22                 HttpListenerContext context = listener.GetContext();

23                 Console.WriteLine("     ");

24 

25                 HttpListenerRequest request = context.Request;

26                 Console.WriteLine("{0}{1}  http/1.1", request.HttpMethod, request.RawUrl);

27                 Console.WriteLine("Accept:{0}", string.Join(",", request.AcceptTypes));

28                 Console.WriteLine("Accept-language:{0}",string.Join(",",request.UserLanguages));

29 

30                 Console.WriteLine("User-Agent:{0}", string.Join(",", request.UserAgent));

31 

32                 Console.WriteLine("Accept-Encoding:{0}", string.Join(",", request.Headers["Accept-Encoding"]));

33 

34                 Console.WriteLine("Connection:{0}", request.KeepAlive ? "Keep-Alive" : "close");

35 

36                 Console.WriteLine("Host:{0}", request.UserHostName);

37                 Console.WriteLine("Pragma:{0}", request.Headers["Pragma"]);

38 

39                 //      

40                 HttpListenerResponse response = context.Response;

41                 string responseString = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head runat=\"server\"> <title>Socket Study </title></head><body><form id=\"form1\" runat=\"server\"><div>Hello World ,Socket Study </div> </form></body></html>";

42                 response.ContentLength64 = Encoding.UTF8.GetByteCount(responseString);

43                 response.ContentType = "text/html;charset=UTF-8";

44                 //      

45                 System.IO.Stream output = response.OutputStream;

46                 System.IO.StreamWriter writer = new System.IO.StreamWriter(output);

47                 writer.Write(responseString);

48                 writer.Close();

49                 if (Console.KeyAvailable)

50                 {

51                     break;

52                 }

53 

54                 listener.Stop();

55             }

56         }

57     }