ホームページ  >  記事  >  バックエンド開発  >  C# は Socket を使用して小規模な Web サーバー コード共有を作成します

C# は Socket を使用して小規模な Web サーバー コード共有を作成します

黄舟
黄舟オリジナル
2017-03-21 11:40:111887ブラウズ

この記事では、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。