TcpListererベースのwebサーバとHttpListererベースのwebサーバ
18708 ワード
『Asp.Net本質論』著者:郝チャンピオン
/*TCPプロトコルに基づくリスナーを簡略化するため、NETはシステムにあります.Net.SocketsネーミングスペースにはTcpListererクラスが用意されており、これを使用すると、コンストラクション関数にネットワークエンドポイント情報のセットを渡すことで、使用するネットワークプロトコルなどの詳細を設定する必要がなくなり、Startメソッドを呼び出した後、リスニング作業が開始されます.AccepttTcpClientメソッドはプロセスをブロックし、クライアントの接続がリスナーに到達することを知っています.このメソッドは、クライアント接続を表すエージェントオブジェクト*/を返します.
/*httpプロトコルのリスナーをさらに簡略化するため、NetはネーミングスペースSystem.NetにはHttpListenerクラスが提供する、このオブジェクトに伴う.NETは一連の関連*オブジェクトがHTTPをカプセル化した処理を提供する.**/
/*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 }