2016-07-22 11 views
-2

大丈夫、最初の質問は申し訳ありませんが悪い質問でした。二度目の試み。 C#とSystem.Netライブラリを使用してWebサーバー(またはレスポンダー?)を作成しました。ここ は、サーバーのパブリック変数です:私のウェブサーバーはサブディレクトリを見つけることができません

private void Listen() 
{ 
    Socket cur = null; 
    try 
    { 
     // Infinite loop 
     while(true) 
     { 
      // Accept incoming socket 
      cur = _TcpListener.AcceptSocket(); 
      // Limit socket buffers 
      cur.SendBufferSize = SendBufferSize; cur.ReceiveBufferSize = ReceiveBufferSize; 
      // Get request 
      byte[] Request = new byte[ReceiveBufferSize]; 
      int RequestSize = cur.Receive(Request); 
      string RequestStr = Encoding.Default.GetString(Request); 
      // Clients send empty requests filled with nulls 
      // To prevent lag if request is empty then directly close stream 
      if (string.IsNullOrWhiteSpace(RequestStr) || string.IsNullOrEmpty(RequestStr)) 
      { 
       cur.Close(); 
      } 
      else 
      { 
       // Process request 
       Process(cur, RequestStr); 
       cur.Close(); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     SendError(cur, "TCPClient Listening Error", "500", "Runtime Exception", ex); 
    } 
} 

このメソッドは、スレッド上で実行されている。ここで

#region "Variables" 
    private TcpListener _TcpListener; 
    private Thread _ListenThread; 
    private string _ServerDataPath = ""; 

    private string _Log = "[XMS LOG] Date : " + DateTime.Now.ToString("r") + "\r\n"; 

    public List<string> Defaults; 
    public Dictionary<string, string> Mimes; 
    #endregion 

    private int _SendBufferSize = 2048; 
    private int _ReceiveBufferSize = 2048; 

    #region "Properties" 
    public int SendBufferSize 
    { 
     get { return _SendBufferSize; } 
     set 
     { 
      if (value <= 0) 
      { 
       return; 
      } 
      _SendBufferSize = value; 
     } 
    } 

    public int ReceiveBufferSize 
    { 
     get { return _ReceiveBufferSize; } 
     set 
     { 
      if (value <= 0) 
      { 
       return; 
      } 
      _ReceiveBufferSize = value; 
     } 
    } 

    public TcpListener Listener 
    { 
     get { return _TcpListener; } 
    } 

    public Thread ListenThread 
    { 
     get { return _ListenThread; } 
    } 

    public String Path 
    { 
     get { return _ServerDataPath; } 
    } 
    #endregion 

私の方法を聞いてからコードがあります。ここでは、HTTPリクエストを処理し、私のプロセスの方法は次のとおりです。

 private void Process(Socket skt, string Request) 
     { 
     try 
     { 
      // Split all the request from line terminators 
      string[] RequestSplit = Request.Split(new string[] { "\r", "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries); 
      // Get Request at top of this split array 
      string GetRequest = RequestSplit[0]; 
      // Trim 
      GetRequest = GetRequest.Trim(); 
      // Is it a get request? 
      if (!GetRequest.StartsWith("GET")) 
      { 
       // Send error and return 
       SendError(skt, "Bad Request : " + GetRequest, "400", "Bad Request"); 
       return; 
      } 
      // Split Get Request 
      string[] GetRequestSplit = GetRequest.Split(new char[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries); 
      // Is Request Legal? 
      // Classical GET requests generally has 3 parts: 
      // GET {FileName} HTTP/1.1 
      // If we get length smaller than 3 then send error 
      if (GetRequestSplit.Length < 3) 
      { 
       SendError(skt, "Bad Request : " + GetRequest, "400", "Bad Request"); 
       return; 
      } 
      Log(GetRequest); 

      // As usual middle one is file 
      string File = GetRequestSplit[1]; 
      // We patch server path directory to this file string 
      File = _ServerDataPath + File; 
      // Control if it is a directory 
      // If it is a directory then control default files 
      bool IsIndex = false; 
      if (System.IO.Directory.Exists(File)) 
      { 
       // This must be an index file 
       IsIndex = true; 
      } 
      // Not index file? No problem 
      // I just control that if there 
      // Is a file called like that 

      if (!IsIndex) 
      { 
       // Oops accidents happen. 
       // Cannot find the file that you requested. 
       if (!System.IO.File.Exists(File)) 
       { 
        SendError(skt, "Cannot find selected file", "404", "Not Found"); 
        return; 
       } 
       // Ok we a legal file 
       // Go out and send it! 
      } 
      // But if file is an index? 
      // Simple, loop over every default file 
      else 
      { 
       // No defaults defined by user? 
       // Sorry, we do not serve index files. 
       if (Defaults.Count == 0) 
       { 
        SendError(skt, "Default files are not allowed", "404", "Not Found"); 
        return; 
       } 

       for (int i = 0; i < Defaults.Count; i++) 
       { 
        if (System.IO.File.Exists(File + "\\" + Defaults[i])) 
        { 
         // Get the index file. Patch it. 
         File += "\\" + Defaults[i]; 
         goto send; 
        } 
       } 
       // Does not contain any default? 
       // Send error again. 
       SendError(skt, "Cannot find default file in requested directory", "404", "Not Fount"); 
       return; 
      } 
     send: 
      // Here we are, sending data... 
      // Byte buffer for sending 
      byte[] Buffer = System.IO.File.ReadAllBytes(File); 
      // Mime? 
      string Mime = GetMime(File); 
      // Directly send while it is hot already! 
      SendMessage(skt, Buffer, true, "200", "OK", Mime); 
     } 
     catch (Exception ex) 
     { 
      SendError(skt, "Unknown exception", "500", "Internal Exception"); 
     } 
    } 

と私の送信メッセージの方法:私は、私はそれらを入れていないのsendError、GetMimeまたはStrIsFile方法に問題がないと思います

 public void SendMessage(Socket skt, byte[] message, bool includeHeader = false, string statusCode = "200", string statusMessage = "OK", string mime = "text/plain") 
    { 
     if (skt == null) { return; } 
     string header = ""; 
     if (includeHeader) 
     { 
      header = "HTTP/1.1 " + statusCode + " " + statusMessage + "\r\n"; 
      header += "Server: XMServer Module\r\n"; 
      header += "Date: " + DateTime.Now.ToString("r") + "\r\n"; 
      header += "Content-Type: " + mime + "; charset=utf-8\r\n"; 
      header += "Connection: Closed"; 
      header += "\r\n\r\n"; 
     } 
     List<byte> buffer = Encoding.Default.GetBytes(header).ToList(); 
     buffer.AddRange(message); 
     skt.Send(buffer.ToArray()); 
    } 

ここに。 これはXMServerという名前のクラスです。ここに私のスタートコードは次のとおりです。

XMServer server = new XMServer(8080, "..\\web\\", 4096, 1024); 
server.Mimes = MIMES; 
server.Defaults = DEFAULTS; 
server.Start(); 

問題は、.. \ウェブ\ 私はそこにindex.htmlファイルを入れて、ブラウザに127.0.0.1:8080を入力し、サーバはindex.htmlをを送信し、サーバのディレクトリが定義されていますページ。これは良いことであり、実装しようとしていることです。私は "web"フォルダに "docs"というフォルダを作成し、 "docs"フォルダに "images"フォルダを置いた。 index.htmlファイルを "docs"フォルダに置く。 index.htmlコンテンツ:

<html> 
    <head> 
     <title> Documentation </title> 
     <meta charset="utf-8"/> 
    </head> 
    <body> 
     <!-- This is where error pops out --> 
     <img src="images/logo.png"/> 
    </body> 
</html> 

サーバーはindex.htmlファイルを正しく送信します。しかし、ページは "GET /images/logo.png HTTP/1.1"のようなリクエストをサーバーに送信します(例だけですが、リクエストが完全にこれと等しいかどうかわかりません)。サーバーは ".. \ web \ docs \ images \ logo.png"ではなく ".. \ web \ images \ logo.png"を送信し、エラーをファイルに記録しようとします(これを行う方法を作成しました)。同じことが、webフォルダのサブIDで別のhtmlファイルへのリンクを与えようとしたときに起こります。どうやってこれを打つことができますか?私のコードは非効率的であると確信しています。どんな助けもありがとう。

+1

投稿する前に良い質問を書く方法については、GUIDをお読みください –

+0

ようこそ!私はあなたの問題が何であるかを非常に明確にしていません...明確かつ徹底的に覚えておきましょう。私たちがあなたを助けるときに何かをするためにいくつかのコードを共有してください。 - 新しいメンバーのために読みやすいのは[質問する](http://stackoverflow.com/help/how-to-ask)と[ツアー](http://stackoverflow.com/tour)です。 –

答えて

0

と命名しました。私はTCPListenerの代わりにHttpListenerを使用しました。現在、サーバは正常に動作しており、PHPファイルも前処理できます。

関連する問題