zoukankan      html  css  js  c++  java
  • C#搭建简单的http服务器,访问静态资源

    代码:

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Web;
    
    namespace ScreenServer.Common
    {
        public class MyHttpServer
        {
            public bool running = false; // Is it running?
    
            private int timeout = 8; // Time limit for data transfers.
            private Encoding charEncoder = Encoding.UTF8; // To encode string
            private Socket serverSocket; // Our server socket
            private string contentPath; // Root path of our contents
    
            // Content types that are supported by our server
            // You can add more...
            // To see other types: 
            private Dictionary<string, string> extensions = new Dictionary<string, string>()
    { 
        //{ "extension", "content type" }
        { "htm", "text/html" },
        { "html", "text/html" },
        { "xml", "text/xml" },
        { "txt", "text/plain" },
        { "css", "text/css" },
        { "png", "image/png" },
        { "gif", "image/gif" },
        { "jpg", "image/jpg" },
        { "jpeg", "image/jpeg" },
        { "zip", "application/zip"}
    };
    
            public bool start(IPAddress ipAddress, int port, int maxNOfCon, string contentPath)
            {
                if (running) return false; // If it is already running, exit.
    
                try
                {
                    // A tcp/ip socket (ipv4)
                    serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
                                   ProtocolType.Tcp);
                    serverSocket.Bind(new IPEndPoint(ipAddress, port));
                    serverSocket.Listen(maxNOfCon);
                    serverSocket.ReceiveTimeout = timeout;
                    serverSocket.SendTimeout = timeout;
                    running = true;
                    this.contentPath = contentPath;
                }
                catch { return false; }
    
                // Our thread that will listen connection requests
                // and create new threads to handle them.
                Thread requestListenerT = new Thread(() =>
                {
                    while (running)
                    {
                        Socket clientSocket;
                        try
                        {
                            clientSocket = serverSocket.Accept();
                            // Create new thread to handle the request and continue to listen the socket.
                            Thread requestHandler = new Thread(() =>
                                {
                                    clientSocket.ReceiveTimeout = timeout;
                                    clientSocket.SendTimeout = timeout;
                                    try { handleTheRequest(clientSocket); }
                                    catch
                                    {
                                        try { clientSocket.Close(); } catch { }
                                    }
                                });
                            requestHandler.Start();
                        }
                        catch { }
                    }
                });
                requestListenerT.Start();
    
                return true;
            }
    
            public void stop()
            {
                if (running)
                {
                    running = false;
                    try { serverSocket.Close(); }
                    catch { }
                    serverSocket = null;
                }
            }
    
            private void handleTheRequest(Socket clientSocket)
            {
                byte[] buffer = new byte[10240]; // 10 kb, just in case
                int receivedBCount = clientSocket.Receive(buffer); // Receive the request
                string strReceived = charEncoder.GetString(buffer, 0, receivedBCount);
    
                // Parse method of the request
                string httpMethod = strReceived.Substring(0, strReceived.IndexOf(" "));
    
                int start = strReceived.IndexOf(httpMethod) + httpMethod.Length + 1;
                int length = strReceived.LastIndexOf("HTTP") - start - 1;
                string requestedUrl = strReceived.Substring(start, length);
    
                string requestedFile;
                if (httpMethod.Equals("GET") || httpMethod.Equals("POST"))
                    requestedFile = requestedUrl.Split('?')[0];
                else // You can implement other methods...
                {
                    notImplemented(clientSocket);
                    return;
                }
    
                requestedFile = requestedFile.Replace("/", @"").Replace("\..", "");
                start = requestedFile.LastIndexOf('.') + 1;
                if (start > 0)
                {
                    length = requestedFile.Length - start;
                    string extension = requestedFile.Substring(start, length);
                    if (extensions.ContainsKey(extension)) // Do we support this extension?
                        if (File.Exists(contentPath + requestedFile)) //If yes check existence of the file
                                                                      // Everything is OK, send requested file with correct content type:
                            sendOkResponse(clientSocket,
                              File.ReadAllBytes(contentPath + requestedFile), extensions[extension]);
                        else
                            notFound(clientSocket); // We don't support this extension.
                                                    // We are assuming that it doesn't exist.
                }
                else
                {
                    // If file is not specified try to send index.htm or index.html
                    // You can add more (default.htm, default.html)
                    if (requestedFile.Substring(length - 1, 1) != @"")
                        requestedFile += @"";
                    if (File.Exists(contentPath + requestedFile + "index.htm"))
                        sendOkResponse(clientSocket,
                          File.ReadAllBytes(contentPath + requestedFile + "\index.htm"), "text/html");
                    else if (File.Exists(contentPath + requestedFile + "index.html"))
                        sendOkResponse(clientSocket,
                          File.ReadAllBytes(contentPath + requestedFile + "\index.html"), "text/html");
                    else
                        notFound(clientSocket);
                }
            }
    
            private void notImplemented(Socket clientSocket)
            {
    
                sendResponse(clientSocket, "<html><head><metahttp-equiv="Content-Type" content="text/html;charset=utf-8"> </head><body><h2>Atasoy Simple Web Server</h2><div>501 - Method Not Implemented</div></body></html>", "501 Not Implemented", "text/html");
    
            }
    
            private void notFound(Socket clientSocket)
            {
                sendResponse(clientSocket, "<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body><h2>Atasoy Simple Web Server</h2><div>404 - Not Found</div></body></html>",
                    "404 Not Found", "text/html");
            }
    
            private void sendOkResponse(Socket clientSocket, byte[] bContent, string contentType)
            {
                sendResponse(clientSocket, bContent, "200 OK", contentType);
            }
    
            // For strings
            private void sendResponse(Socket clientSocket, string strContent, string responseCode, string contentType)
            {
                byte[] bContent = charEncoder.GetBytes(strContent);
                sendResponse(clientSocket, bContent, responseCode, contentType);
            }
    
            // For byte arrays
            private void sendResponse(Socket clientSocket, byte[] bContent, string responseCode, string contentType)
            {
                try
                {
                    byte[] bHeader = charEncoder.GetBytes(
                                        "HTTP/1.1 " + responseCode + "
    "
                                      + "Server: Atasoy Simple Web Server
    "
                                      + "Content-Length: " + bContent.Length.ToString() + "
    "
                                      + "Connection: close
    "
                                      + "Content-Type: " + contentType + "
    
    ");
                    clientSocket.Send(bHeader);
                    clientSocket.Send(bContent);
                    clientSocket.Close();
                }
                catch { }
            }
    
        }
    }

    使用

     string bastPath = System.AppDomain.CurrentDomain.BaseDirectory;
     // to create new one:
     MyHttpServer server = new MyHttpServer();
     // to start it
     server.start(IPAddress.Parse("127.0.0.1"), 8082, 500, bastPath);

    转自:http://blog.okbase.net/haobao/archive/60.html

  • 相关阅读:
    CodeForces-1263D Secret Passwords 并查集 求连通分量
    Virtual Friends HDU
    AreYouBusy HDU
    Jack Straws POJ
    Divisibility by 25 CodeForces
    逃离迷宫 HDU
    Find a way HDU
    Stall Reservations POJ
    Three displays CodeForces
    Radar Installation POJ
  • 原文地址:https://www.cnblogs.com/feigao/p/14759057.html
Copyright © 2011-2022 走看看