この記事では、C#を使った小規模な Web サーバーの作成に関する情報を中心に、サンプルコードを通じて詳しく紹介しています。
Webサーバーを実装するには、次のコードブラウザアクセスを通じてアクセスされたデータを取得できます。
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81)); socketWatch.Listen(20); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的。 Thread thread = new Thread(delegate(object obj) { Socket socketListen = (Socket)obj; while (true) { Socket socket = socketListen.Accept(); byte[] data = new byte[1024 * 1024 * 4]; // 浏览器发来的数据,限定为 4K。 int length = socket.Receive(data, 0, data.Length, SocketFlags.None); socket.Send(Encoding.UTF8.GetBytes("欢迎访问 www.cftea.com\r\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"))); socket.Shutdown(SocketShutdown.Both); socket.Close(); } }); thread.IsBackground = true; thread.Start(socketWatch);
しかし、上記は単なる原則であり、実際には非常に複雑になります。ただし、単純な Web サーバーを作成したい場合でも、次の 2 つの問題を解決する必要があります:
1. HTTP ヘッダーの出力
byte[] body = Encoding.UTF8.GetBytes("欢迎访问 www.cftea.com\r\n" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK Content-Length: " + body.Length + @" Content-Type: text/plain Date: " + string.Format("{0:R}", DateTime.Now) + @" Server: Cftea Web Server "); socket.Send(head); socket.Send(body);
特定の形式がある限り、ブラウザでは HTTP ヘッダーとして扱われます。 HTTP ヘッダーの形式は次のとおりです:
1 行目: HTTP/1.x + スペース + ステータス コード + スペース + 説明
中間行: 名前 + コロン + スペース (省略可能) + 値
最後の行: 空白行
形式が正しい必要があります。正しくないと、ブラウザによる HTTP ヘッダーと HTTP ボディの認識に影響します。
2. HTTP ヘッダーのリクエスト
これまでのところ、ブラウザに入力された URL が何であるかはわかりません。リクエストの HTTP ヘッダーにも特定の形式があります。これを取得して逆アセンブルするだけで URL を取得できます。
分解は難しくありません。入手方法について説明しましょう。以前のデータと長さは常に役に立たないのではないでしょうか?以下の通り:
string requestText = Encoding.UTF8.GetString(data, 0, length);
完全なコード
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socketWatch.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 81)); socketWatch.Listen(20); // 参数表示最多可容纳的等待接受的传入连接数,不包含已经建立连接的。 Thread thread = new Thread(delegate(object obj) { Socket socketListen = (Socket)obj; while (true) { using (Socket socket = socketListen.Accept()) { byte[] data = new byte[1024 * 1024 * 4]; // 浏览器发来的数据 int length = socket.Receive(data, 0, data.Length, SocketFlags.None); if (length > 0) { string requestText = Encoding.UTF8.GetString(data, 0, length); byte[] body = Encoding.UTF8.GetBytes(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")); byte[] head = Encoding.UTF8.GetBytes(@"HTTP/1.1 200 OK Content-Length: " + body.Length + @" Content-Type: text/plain Date: " + string.Format("{0:R}", DateTime.Now) + @" Server: Cftea Web Server "); socket.Send(head); socket.Send(body); } socket.Shutdown(SocketShutdown.Both); socket.Close(); } } }); thread.IsBackground = true; thread.Start(socketWatch);
概要
以上がC# は Socket を使用して小規模な Web サーバー コード共有を作成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。