User:クライアントからの接続を待機し、接続を受信したら、その単一の接続IPアドレスからのみの接続のみを許可するシンプルなPython3 HTTPSファイルサーバーを作成します。他のユーザーが接続しようとした場合、エラーページでサーバーに返信します。また、繰り返しダウンロードを許可する代わりに、サーバーを1回だけダウンロードできるようにするためのサーバーを作成します。 Assistant:これは、Python3の説明されているHTTPSファイルサーバーのサンプル実装です。

``インポートSSL
ソケットをインポートします

コンテキスト= ssl.create_default_context（ssl.purpose.client_auth）
context.load_cert_chain（certfile = "server.crt"、keyfile = "server.key"）

host = ''
ポート= 443

クライアント= []

def handle_client（conn、addr）：
    addr [0]がクライアントではない場合：
        clients.append（addr [0]）
        本当です：
            data = conn.recv（1024）
            データでない場合：
                壊す
            data.startswith（b'get /'）の場合：
                ＃GETリクエストで要求されたファイルを提供します
                filename = data.split（）[1] .decode（）[1：]
                試す：
                    fを開いている（filename、 'rb'）as f：
                        file_data = f.read（）
                        conn.sendall（b'http/1.1 200 ok \ r \ n \ r \ n ' + file_data）
                        ＃サーバーからファイルを削除して、1回だけダウンロードできるようにします
                        open（filename、 'w'）。close（）
                filenotfounderrorを除く：
                    conn.sendall（b'http/1.1 404は見つかりません\ r \ n \ r \ n <html> <body> <h1> 404が見つかりません</h1> </body> body> </html> '）
            それ以外：
                壊す
        clients.remove（addr [0]）
    それ以外：
        conn.sendall（b'http/1.1 403 FORBIDDEN \ r \ n \ r \ n <html> <body> <h1> 403禁止</h1> </body> body> </html> '）
    conn.close（）

socket.socket（socket.af_inet、socket.sock_stream）をsとして：
    S.Bind（（ホスト、ポート））
    s.listen（）
    本当です：
        conn、addr = s.accept（）
        handle_client（context.wrap_socket（conn、server_side = true）、addr） `` `

この実装では、SSLライブラリを使用してデフォルトのSSLコンテキストを作成し、サーバーの証明書と秘密キーをロードします。ソケットライブラリは、ソケットを作成およびバインドし、着信接続を聞き、接続を受け入れるために使用されます。

接続クライアントごとに `handle_client`関数は呼び出され、接続するIPアドレスが接続されたクライアントのリストにまだ含まれていない場合、要求されたファイルを提供します。要求されたファイルが見つからない場合、関数は404ステータスコードを備えたエラーページを送信します。接続するIPアドレスが既に接続されたクライアントのリストにある場合、関数は403ステータスコードを持つエラーページを送信します。

この実装はファイルのみを提供し、HTTPヘッダーやGET以外のリクエスト方法など、他のタイプのリクエストやHTTP機能を処理しないことに注意してください。これは基本的な出発点であることを目的としており、必要に応じて拡張できます。 
User:今度はExpress.jsを使用して、もう一度やり直してください
node.jsのexpress.jsを使用して、説明されているhttpsファイルサーバーの実装を次に示します。

「const https = require（ 'https'）;
const express = require（ 'express'）;

const app = express（）;

const options = {
  キー：fs.readfilesync（ 'server.key'）、
  cert：fs.readfilesync（ 'server.crt'）
};

const clients = new set（）;

app.get（ '/：filename'、（req、res）=> {
  const {ip} = req.Connection;
  if（clients.has（ip））{
    Res.Status（403）.send（ '<html> <body> <h1> 403 ilbridden </h1> </body> </html>'）;
  } それ以外 {
    clients.add（ip）;
    const {filename} = req.params;
    fs.Access（filename、fs.constants.r_ok、（err）=> {
      if（err）{
        Res.Status（404）.send（ '<html> <body> <h1> 404が見つかりません</h1> </body> </html>'）;
      } それ以外 {
        fs.readfile（filename、（error、data）=> {
          if（error）{
            Res.Status（500）.Send（ '<html> <body> <h1> 500内部サーバーエラー</h1> </body> </html>'）;
          } それ以外 {
            Res.Status（200）.send（data）;
            fs.unlink（filename、（linkerror）=> {
              if（loninkerror）{
                Console.Error（linkerror）;
              }
            }）;
          }
        }）;
      }
    }）;
  }
}）;

https.createserver（options、app）.listen（443、（）=> {
  console.log（ 'httpsファイルサーバーがポート443でリスニングされています'）;
}）; `` `

この実装では、FS、HTTPS、およびExpressライブラリを使用して、HTTPSを介してファイルを提供します。Expressライブラリは、着信HTTP要求を処理し、HTTP応答を送信するために使用されます。

「クライアント」セットは、接続されたクライアントを追跡し、各ファイルが単一のIPアドレスに1回しか提供されていないことを確認するために使用されます。`app.get`メソッドは、着信GETリクエストを処理し、要求されたファイルを提供するために使用されます。ファイルが見つからない場合、関数は404ステータスコードのエラーページを送信します。接続IPアドレスが既にファイルを受信している場合、関数は403ステータスコードのエラーページを送信します。

この実装は、基本的な出発点でもあり、必要に応じて拡張できることに注意してください。