精华内容
下载资源
问答
  • c#http服务器
    万次阅读
    2017-08-19 16:38:24
    问题: Win7下在尝试搭建简单http服务器的时候,执行httpListener.Start();报错 HttpListener拒绝访问异常
    代码如下:
    HttpListener httpListener = new HttpListener();//创建服务器监听
    httpListener.Prefixes.Add("http://+:8080/");//配置监听地址。+代表本机可能的IP如localhost、127.0.0.1、192.168.199.X(本机IP)等;
    httpListener.Start(); //开启对指定URL和端口的监听,开始处理客户端输入请求。
    解决方法:
    以管理员CMD命令行执行:
    ①先删除可能存在的错误urlacl,这里的*号代指localhost、127.0.0.1、192.168.199.X本地地址和+号等。
    命令:netsh http delete urlacl url=http://*:8080/ 
    举例:netsh http delete urlacl url=http://+:8080/ 
    ②将上面删除的*号地址重新加进url,user选择所有人
    命令:netsh http add urlacl url=http://*:8080/  user=Everyone
    举例:netsh http add urlacl url=http://+:8080/  user=Everyone
    ③CMD配置防火墙
    netsh advfirewall firewall Add rule name=\"命令行Web访问8080\" dir=in protocol=tcp localport=8080 action=allow
    经过如上设置服务端就可以以httpListener.Prefixes.Add("http://+:8080/");监听地址开启监听。客户端可以通过访问服务端8080端口。服务端本机也可以在浏览器中以localhost和127.0.0.1访问自身http服务器。
    17.8.23补充:
    上面的命令最好手打一下输入,今天尝试复制到cmd执行的时候会报无法识别命令的错误。
    更多相关内容
  • C# Http服务器

    2017-06-01 14:05:17
    【源码】【vs2010】Http服务器
  • 主要介绍了基于C#实现一个最简单的HTTP服务器的方法,详细分析了http服务器的实现原理与相关技巧,以及对应的注意事项,需要的朋友可以参考下
  • c#编程实现一个简单的http服务器,包括get和post方法
  • 本文以两种稍微有差别的方式用C#语言实现HTTP协议的服务器类,之所以写这些,也是为了自己能更深刻了解HTTP底层运作。要完成高性能的Web服务功能,通常都是需要写入到服务,如IIS,Apache Tomcat,但是众所周知的Web...
  • 因此就想自己尝试一下能不能直接用C#实现一个简单的http服务器,搜了一些资料后发现。一种是用Socket实现,一种是用HttpListener实现。Socket的实现不够直观明朗,但是更灵活。因为我的需求就是期望客户端那用简单的...

    为什么会有这个需求呢,是这样的,我们希望在手机端能够实时的把日志汇报到一个测试用的服务器上。因为本人是客户端,而且也不想占用服务器资源。因此就想自己尝试一下能不能直接用C#实现一个简单的http服务器,搜了一些资料后发现。一种是用Socket实现,一种是用HttpListener实现。Socket的实现不够直观明朗,但是更灵活。因为我的需求就是期望客户端那用简单的http请求就可以把游戏内日志汇报上来,因此简单易用是第一需求。

    原作者找不到了,这是我找到的那个参考

    https://www.h3399.cn/201709/136120.html

    在他的基础上,我经过修改测试,整理了一个可用的代码如下:

    我是VS2019的一个WinForm工程

        class SimpleHttpServer
        {
            private HttpListener _listener;
            public SendOrPostCallback Handler = null;
            public SynchronizationContext UiContext = null;
    
            private void RequestHandler(IAsyncResult result)
            {
                try
                {
                    HttpListenerContext context = _listener.EndGetContext(result);
                    byte[] buffer = new byte[8096];
                    using (Stream stream = context.Request.InputStream)
                    {
                        int count = 0;
                        while ((count = stream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            UiContext.Send(Handler, Encoding.UTF8.GetString(buffer, 0, count));
                        }
                    }
                    StreamWriter sw = new StreamWriter(context.Response.OutputStream, Encoding.UTF8);
                    context.Response.ContentType = "text/html";
                    context.Response.ContentEncoding = Encoding.UTF8;
                    context.Response.Close();
                }
                catch (Exception e)
                {
                    //
                }
                finally
                {
                    if (_listener.IsListening)
                    {
                        _listener.BeginGetContext(RequestHandler, new object());
                    }
                }
            }
    
            public void Start()
            {
                _listener = new HttpListener();
                _listener.Prefixes.Add("http://+:10086/");
                _listener.Start();
                _listener.BeginGetContext(RequestHandler, new object());
            }
    
            public void Close()
            {
                _listener.Stop();
                _listener.Abort();
            }
        }

    请注意,这里我什么也没有返回,因为我需要的就是仅接受到消息就OK

    启用的时候,在界面初始化的时候,调用Start()方法即可,然后测试可以在浏览器上输入局域网的IP地址测试

    例如http://192.168.xx.xx:10086

    这里10086也是自己随便定义的一个端口,如果显示一个空白的页面,证明消息就收到了。

    try内是服务器收到请求的处理,因为我是用Winform做的,涉及到一个UI线程同步问题,因此用了SynchronizationContext 来处理。实际上可以根据自己的需求去处理这个string字段

    在Unity里,可以用UnityWebRequest来简单模拟,这样调用

    using (UnityWebRequest unityWebRequest = new UnityWebRequest(_uri, UnityWebRequest.kHttpVerbPOST))
    {
        unityWebRequest.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(log))
        {
            contentType = "application/x-www-form-urlencoded"
        };
    
        unityWebRequest.timeout = 3;
        unityWebRequest.useHttpContinue = false;
        yield return unityWebRequest.SendWebRequest();
    }

    log就是我们要发送的日志内容本身。

    需要注意的一点是,运行服务器的主机一定要关掉防火墙,或者加入白名单,不然会有可能造成别的机器无法访问的问题。另外我只测试了内网。外网的情况下,可能需要IP映射

    附:

    在安卓上测试也是OK的,还没在Ios上测试,后续测试过了也补充进来

    另外,unity可以通过

    Application.logMessageReceivedThreaded += OnLogHandle

    方法来监听所有日志,在应用里,只需要添加自己处理日志的方法即可。为了不阻塞游戏,请做个缓存队列~不然经常卡死unity。试想,如果你在错误日志处理里也出错,这个错误又会触发错误日志处理,就直接死循环了。反正要注意下这个问题

    展开全文
  • C#编写的基本HTTP服务器框架。 执照 ,“授予您复制,分发和/或修改它的法律许可。” 功能要求 我目前不积极开发此项目,但我想复兴它。 它正在学术环境中使用。 如果我可以添加任何功能来协助您的项目,请随时...
  • C#实现HTTP代理服务器技术

    热门讨论 2013-03-13 15:42:44
    采用c#实现的代理服务器技术,绝对的通俗易懂,而且可以作为很好的学习案例进行分析。特别是和http协议打交道比较多的c#.net程序员可千万别错过哦!只要能够学到东西,积分都是浮云
  • 康帕纳简单的 HTTP 服务器框架,用 C# 编写。 灵感来自。 Espresso con panna也是意大利语中的奶油咖啡。 注意:这是一个为学习和娱乐而构建的项目,不打算在生产中使用(目前)。例子只需几行代码,您就可以使用 ...
  • 有小伙伴提问,c#有没有轻量级的Http服务器,因为直接部署Asp.net Core的话,有点太大了。而且,学习成本也高。我说,微软不是有HttpListener吗?他说不好用。好吧。。。。在这里推荐RRQMSocket.Http,这是一个开源...


    一、说明

    有小伙伴提问,c#有没有轻量级的Http服务器,因为直接部署Asp.net Core的话,有点太大了。而且,学习成本也高。

    我说,微软不是有HttpListener吗?

    他说不好用。

    好吧。。。。

    在这里推荐TouchSocket,这是一个开源的,轻量级,高性能的Http组件。支持Ssl和多通道的文件传输。


    二、程序集源码

    2.1 源码位置

    2.2 说明文档

    文档首页

    三、安装

    Nuget安装TouchSocket即可,具体步骤详看链接博客。

    VS、Unity安装和使用Nuget包

    四、创建服务器

    服务器的创建非常简单,设置好需要监听的地址即可。

    var service = new HttpService();
    
    var config = new RRQMConfig();
    config.UsePlugin()
        .SetReceiveType(ReceiveType.Auto)
        .SetListenIPHosts(new IPHost[] { new IPHost(7789) });
    
    service.Setup(config).Start();
    
    service.AddPlugin<MyHttpPlug>();//添加自定义插件。
    service.AddPlugin<HttpStaticPagePlugin>().
                   AddFolder("../../../../../api");//添加静态页面文件夹
    
    Console.WriteLine("Http服务器已启动");
    

    【处理请求】

    HttpService处理请求的方式,主要是通过插件实现的。

    例如:下列示例的插件。就会处理url为“/success”的请求。同时,还能获得相关参数。

     /// <summary>
        /// 支持GET、Post、Put,Delete,或者其他
        /// </summary>
     class MyHttpPlug : HttpPluginBase
     {
         protected override void OnGet(ITcpClientBase client, HttpContextEventArgs e)
         {
             if (e.Context.Request.UrlEquals("/success"))
             {
                 e.Context.Response.FromText("Success").Answer();//直接回应
                 Console.WriteLine("处理完毕");
                 e.Handled = true;
             }
             else if (e.Context.Request.UrlEquals("/file"))
             {
                 e.Context.Response
                     .SetStatus()//必须要有状态
                     .FromFile(@"D:\System\Windows.iso", e.Context.Request);//直接回应文件。
             }
             base.OnGet(client, e);
         }
     }
    
    

    实际上,该Http组件,还能更加简单的支持WebSocket,XmlRpc,JsonRpc等内容。更多使用技巧,大家可以从说明文档获得。

    展开全文
  • 前面文章实现了HTTP请求头的解析,现在我们尝试向浏览器发送一些内容。

    完整项目托管地址:https://github.com/hooow-does-it-work/http

    前面文章实现了HTTP请求头的解析:C#实现HTTP服务器:(1)解析HTTP请求头
    现在我们尝试向浏览器发送一些内容。
    本文使用Content-Length发送固定长度内容的响应数据,后面会写文使用Chunked方式发送数据。

    修改前面文章NewClient重载的内容如下。

    public class HttpServer : TcpIocpServer
    {
        protected override void NewClient(Socket client)
        {
            Stream stream = new NetworkStream(client, true);
    
            //捕获一个HttpRequest
            HttpRequest request = HttpRequest.Capture(stream);
    
            //实例化HttpResponse,方便管理HTTP响应头
            HttpResponse response = new HttpResponse(200);
    
            //需要发送到客户端的内容
            string responseText = "<p>hello world!</p>";
    
            //内容对应的二进制数据
            byte[] responseBody = Encoding.ASCII.GetBytes(responseText);
    
            //设置Content-Length请求头,大小为响应内容的二进制数据长度
            //由于HTTP/1.1协议的限制,客户端必须有明确的界定条件,来从传输中读取正确的内容
            //一种方法就是,设置Content-Length头,客户端只要读取指定长度的数据即可。
            //再一种方法就是,使用Chunked,进行分块传输,用一个结束快告诉客户端,数据传输完毕了
            //还有就是,服务器发送完数据后,可以直接关闭连接,客户端读完全部数据。
            //
            //对于一些不需要响应内容的code,可以不设置。例如204 No Content
            response.SetHeader("Content-Length", responseBody.Length.ToString());
    
            //设置响应内容类型,这里设置为text/html
            response.SetHeader("Content-Type", "text/html");
    
            //告诉浏览器,本次连接为非长链,服务器会关闭连接。
            //HTTP/1.1允许长链接,可以在一个连接上发送多次请求和响应。
            response.SetHeader("Connection", "close");
    
            //获取整个需要发送给客户端的响应头
            string responseHeaders = response.GetAllResponseHeaders();
            byte[] responseHeaderBuffer = Encoding.ASCII.GetBytes(responseHeaders);
    
            //发送响应头
            stream.Write(responseHeaderBuffer, 0, responseHeaderBuffer.Length);
    
            //发送响应内容
            stream.Write(responseBody, 0, responseBody.Length);
    
            stream.Close();
        }
    }
    

    服务器启动成功后,浏览器访问:http://127.0.0.1:4189/
    浏览器响应
    我们可以将浏览器请求的信息,发回给浏览器,看看我们解析的数据和浏览器发送的是否一致。
    将responseText部分代码修改为下面内容。

     //需要发送到客户端的内容
     string responseText = $"<p>hello world!</p><pre>{request.GetAllRequestHeaders()}</pre>";
    

    浏览器访问:http://127.0.0.1:4189/,响应如下图。
    可以看到,我们解析的内容,跟浏览器发送的Request Headers完全一致。
    Response Headers也是我们在代码中设置的响应头。
    浏览器响应

    这里我们实现了使用Content-Length向浏览器发送数据。
    下篇文章,我们将使用Chunked方式,发送数据到浏览器。

    HttpResponse类源码
    public class HttpResponse
    {
        private int _statusCode = 200;
        private string _statusText = "OK";
        private string _httpProtocol = null;
    
        private NameValueCollection _headers = new NameValueCollection();
    
        public NameValueCollection Headers => _headers;
    
        public int StatusCode { 
            get => _statusCode; 
            set {
                string statusText = HttpStatus.GetStatus(value);
    
                if (string.IsNullOrEmpty(statusText))
                    throw new Exception($"未知状态码:{value}");
    
                _statusCode = value;
                _statusText = statusText;
            }
        }
    
        internal HttpResponse() { }
    
        /// <summary>
        /// 使用状态码和协议实例化一个HttpResponse类
        /// </summary>
        /// <param name="statusCode">状态码,200、400等</param>
        /// <param name="httpProtocol">协议,默认用HTTP/1.1</param>
        public HttpResponse(int statusCode, string httpProtocol = "HTTP/1.1")
        {
            StatusCode = statusCode;
            _httpProtocol = httpProtocol;
        }
    
        /// <summary>
        /// 添加响应头
        /// </summary>
        /// <param name="name">名称</param>
        /// <param name="value">值</param>
        public void AddHeader(string name, string value)
        {
            _headers.Add(name, value);
        }
    
        /// <summary>
        /// 设置响应头
        /// </summary>
        /// <param name="name">名称</param>
        /// <param name="value">值</param>
        public void SetHeader(string name, string value)
        {
            _headers.Set(name, value);
        }
    
        /// <summary>
        /// 删除响应头
        /// </summary>
        /// <param name="name">名称</param>
        public void RemoveHeader(string name)
        {
            _headers.Remove(name);
        }
    
    
        /// <summary>
        /// 获获取完整的响应头
        /// </summary>
        /// <returns>完整响应头</returns>
        public string GetAllResponseHeaders()
        {
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("{0} {1} {2}\r\n", _httpProtocol, _statusCode, _statusText);
    
            foreach (string name in _headers.Keys)
            {
                string[] values = _headers.GetValues(name);
                if (values == null || values.Length == 0) continue;
    
                foreach (string value in values)
                {
                    if (value == null) continue;
                    sb.AppendFormat("{0}: {1}\r\n", name, value);
                }
            }
            sb.Append("\r\n");
    
            return sb.ToString();
        }
    }
    
    HttpStatus类源码

    可以从statusCode获取statusText。

    
    public class HttpStatus
    {
        private static readonly string[][] s_HTTPStatusDescriptions;
        private static Dictionary<int, string> m_Cached = new Dictionary<int, string>();
        static HttpStatus()
        {
            s_HTTPStatusDescriptions = new string[6][];
    
            s_HTTPStatusDescriptions[1] = new string[] {
                "Continue", "Switching Protocols", "Processing"
            };
    
            s_HTTPStatusDescriptions[2] = new string[] {
                "OK", "Created", "Accepted", "Non-Authoritative Information", "No Content", "Reset Content", "Partial Content", "Multi-Status"
            };
    
            s_HTTPStatusDescriptions[3] = new string[] {
                "Multiple Choices", "Moved Permanently", "Found", "See Other", "Not Modified", "Use Proxy", string.Empty, "Temporary Redirect"
            };
    
            s_HTTPStatusDescriptions[4] = new string[] {
                "Bad Request", "Unauthorized", "Payment Required", "Forbidden", "Not Found", "Method Not Allowed", "Not Acceptable",
                "Proxy Authentication Required", "Request Timeout", "Conflict", "Gone", "Length Required", "Precondition Failed",
                "Request Entity Too Large", "Request-Uri Too Long", "Unsupported Media Type",
                "Requested Range Not Satisfiable", "Expectation Failed", string.Empty, string.Empty, string.Empty, string.Empty,
                "Unprocessable Entity", "Locked", "Failed Dependency"
            };
    
            s_HTTPStatusDescriptions[5] = new string[] { "Internal Server Error", "Not Implemented", "Bad Gateway", "Service Unavailable",
                "Gateway Timeout", "Http Version Not Supported", string.Empty, "Insufficient Storage"
            };
    
        }
    
        public static string GetStatus(int code)
        {
            if (m_Cached.ContainsKey(code)) return m_Cached[code];
    
            int main = code / 100;
            int sub = code % 100;
            if (main <= 0 || main > 5)
            {
                m_Cached[code] = "";
                return "";
            }
    
            string[] texts = s_HTTPStatusDescriptions[main];
            if (sub < 0 || sub >= texts.Length)
            {
                m_Cached[code] = "";
                return "";
            }
            m_Cached[code] = texts[sub];
            return texts[sub];
        }
    }
    
    展开全文
  • C#实现HTTP服务器

    万次阅读 2016-08-26 15:09:33
    这个类几行代码就能完成一个简单的服务器功能。虽然以下内容在实际运行中几乎毫无价值,但是也不失为理解HTTP请求过程的细节原理的好途径。 HttpListener httpListener = new HttpListener(); httpListene
  • 实现一个HTTP服务器监听的类,并尝试解析浏览器发送来的HTTP请求头。
  • 构建一个简单的HTTP服务器 一、程序界面 启动程序,运行后,在浏览器中输入 http://localhost:8888/ ,可返回结果。 二、基本原理 1、HTTP协议 HTTP是超文本传输协议(HyperText Transfer Protocol)的简称,它...
  • MQTT连接服务器,定时发布车间信息,收到服务器车间信息请求后,也可以发布车间信息。定时采集机床数据,在界面刷新显示,并通过MQTT按照工厂设备id数据的格式发布至服务器。云端可查看设备状态数据。
  • HTTP服务器示例 class Program { static void Main(string[] args) { ExampleServer server = new ExampleServer("0.0.0.0",4050); server.Start(); } } GET/POST请求示例 public override void OnPost...
  • 在unity内创建http服务器C#

    千次阅读 2021-11-11 16:43:24
    c#中可以使用HttpListener实现简单的http服务端。 调用SerManager.StartSer( 端口);开启服务器 SerManager.StopServer()关闭 using System; using System.Collections.Generic; using System.Net; using System....
  • 构建一个简单的HTTP服务器C#程序实例。实现响应GET、POST请求。在服务端创建一个tcp通信来负责监听客户端连接。每次客户端发出请求后,我们根据请问报文来判断客户端的请求类型,然后根据不同的请求类型进行相应的...
  • C#实现基于http长连接“服务器推”-Comet技术 很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。 本项目基于 AJAX 的长轮询方式实现。 ...
  • C#版支持高并发的HTTP服务器源码

    热门讨论 2016-09-30 11:44:04
    C#版支持高并发的HTTP服务器源码,异步处理并发调用,应用于WINFORM程序中,创建自己的HTTP SERVER的首选办法。
  • C#调用httplistener实现简单的http服务器例子:编译后是一个控制台应用程序,启动后,可通过 http://127.0.0.1/ 访问,采用了回调模式提供http服务,支持高并发
  • * C#实现了一个最简单的HTTP服务器类,你可以将它嵌入到自己的项目中,或者也可以阅读代码来学习关于HTTP协议的知识。 * 高性能的WEB应用一般都架设在强大的WEB服务器上,例如IIS, Apache, 和Tomcat。然而,HTML是...
  • C#实现把图片下载到服务器代码 ASPX页面代码: <%@ Page Language=C# AutoEventWireup=true CodeBehind=GetPictureByUrl.aspx.cs Inherits=HoverTreeMobile.GetPictureByUrl %> <!DOCTYPE html> <...
  • C# HttpServer 实现

    2013-01-30 15:50:02
    C# httpserver 的实现,简单的封装,非常实用!更适合初学者的学习、借鉴
  • 主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下
  • 分别通过PerformanceCount、ManagementClass、OpenHardwareMonitor、kernel32 来综合获取下面信息: 内存使用率、总CPU百分比、获得物理总内存(、获得可用内存(G)、获取mac地址、获取分区信息使用空间 ...
  • C#简单的web服务器

    2018-10-12 10:21:13
    C#编写的简单的web服务器

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 139,297
精华内容 55,718
关键字:

c#http服务器

c# 订阅
友情链接: MYplayer.rar