日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

了解HttpListener:用于創(chuàng)建基于HTTP協(xié)議的桌面&Web應(yīng)用程序

來源: 責(zé)編: 時(shí)間:2024-02-29 14:37:13 250觀看
導(dǎo)讀一、場景思考在某些情況下,如使用WPF、WinForm或Windows服務(wù)開發(fā)的程序,可能需要提供接口以便第三方服務(wù)主動(dòng)與其通信,并進(jìn)行服務(wù)調(diào)用和數(shù)據(jù)推送,你想到哪些簡單的方式快速實(shí)現(xiàn)?二、方案對(duì)比想到的部分實(shí)現(xiàn)方式有以下幾種:

一、場景思考

在某些情況下,如使用WPF、WinForm或Windows服務(wù)開發(fā)的程序,可能需要提供接口以便第三方服務(wù)主動(dòng)與其通信,并進(jìn)行服務(wù)調(diào)用和數(shù)據(jù)推送,你想到哪些簡單的方式快速實(shí)現(xiàn)?FXQ28資訊網(wǎng)——每日最新資訊28at.com

二、方案對(duì)比

想到的部分實(shí)現(xiàn)方式有以下幾種:FXQ28資訊網(wǎng)——每日最新資訊28at.com

FXQ28資訊網(wǎng)——每日最新資訊28at.com

Web服務(wù):使用Web服務(wù)(如RESTful API)可以使得第三方服務(wù)通過HTTP協(xié)議與你的程序通信。在WPF和WinForm中,可以使用ASP.NET Web API或ASP.NET Core Web API來實(shí)現(xiàn)接口邏輯。在Windows服務(wù)中,可以使用相應(yīng)的框架(如Topshelf)來實(shí)現(xiàn)接口邏輯。FXQ28資訊網(wǎng)——每日最新資訊28at.com

消息隊(duì)列:使用消息隊(duì)列(如RabbitMQ、Kafka)可以使得第三方服務(wù)通過異步消息傳遞與你的程序通信。這樣可以提高程序的可靠性和擴(kuò)展性,避免因?yàn)榈谌椒?wù)的延遲或故障導(dǎo)致程序出現(xiàn)問題。FXQ28資訊網(wǎng)——每日最新資訊28at.com

RPC(Remote Procedure Call):使用RPC可以使得第三方服務(wù)像調(diào)用本地函數(shù)一樣調(diào)用你的程序提供的接口。常見的RPC框架包括gRPC、Apache Thrift等。FXQ28資訊網(wǎng)——每日最新資訊28at.com

Socket編程:使用Socket編程可以使得第三方服務(wù)與你的程序建立長連接,進(jìn)行實(shí)時(shí)通信。這種方式適合需要高頻率交互的場景,但需要考慮網(wǎng)絡(luò)穩(wěn)定性和安全性等問題。FXQ28資訊網(wǎng)——每日最新資訊28at.com

其他方式:根據(jù)具體業(yè)務(wù)需求,還可以使用其他方式來實(shí)現(xiàn)接口的提供,如使用FTP、SMTP等協(xié)議進(jìn)行文件傳輸和郵件推送等。FXQ28資訊網(wǎng)——每日最新資訊28at.com

三、方案擇一

本文就是采用一種非常簡單的方式來對(duì)外提供接口,代碼很簡單就是使用.net里的System.Net命名空間下的HttpListener就可以實(shí)現(xiàn)Http協(xié)議的Server端。FXQ28資訊網(wǎng)——每日最新資訊28at.com

適用場景說明

HttpListener 是 .NET Framework 提供的一個(gè)類,用于創(chuàng)建基于 HTTP 協(xié)議的服務(wù)器。它可以在本地監(jiān)聽指定的 IP 地址和端口號(hào),并接收來自客戶端的 HTTP 請(qǐng)求。HttpListener 可以用于各種場景,包括但不限于以下幾個(gè)方面:FXQ28資訊網(wǎng)——每日最新資訊28at.com

Web API:可以使用 HttpListener 創(chuàng)建自己的 Web API 服務(wù),接收客戶端的 HTTP 請(qǐng)求,并根據(jù)請(qǐng)求內(nèi)容進(jìn)行相應(yīng)的處理和響應(yīng)。這對(duì)于需要輕量級(jí)的、自定義的 Web 服務(wù)非常有用,尤其是在沒有使用 ASP.NET 或其他 Web 框架的情況下。FXQ28資訊網(wǎng)——每日最新資訊28at.com

嵌入式 Web 服務(wù)器:如果應(yīng)用程序需要內(nèi)置一個(gè)簡單的 Web 服務(wù)器,以提供靜態(tài)文件或動(dòng)態(tài)內(nèi)容,那么可以使用 HttpListener。例如,你可以將 HTML、CSS、JavaScript 文件作為靜態(tài)資源提供給客戶端,或者根據(jù)客戶端請(qǐng)求生成動(dòng)態(tài)的 HTML 頁面。FXQ28資訊網(wǎng)——每日最新資訊28at.com

反向代理:HttpListener 還可以用于創(chuàng)建反向代理服務(wù)器。通過監(jiān)聽指定的端口,將客戶端的請(qǐng)求轉(zhuǎn)發(fā)到不同的后端服務(wù)器上,并將后端服務(wù)器的響應(yīng)返回給客戶端。這在構(gòu)建高性能、負(fù)載均衡的 Web 服務(wù)器集群時(shí)非常有用。FXQ28資訊網(wǎng)——每日最新資訊28at.com

測試和調(diào)試:在開發(fā)和調(diào)試階段,可以使用 HttpListener 模擬一個(gè)簡單的 HTTP 服務(wù)器,以接收和處理來自客戶端的請(qǐng)求。這樣可以方便地測試和調(diào)試應(yīng)用程序,而無需依賴于外部的 Web 服務(wù)器。FXQ28資訊網(wǎng)——每日最新資訊28at.com

注意事項(xiàng):使用 HttpListener 創(chuàng)建的服務(wù)器通常是基于 HTTP 協(xié)議的,因此它適用于與客戶端之間進(jìn)行 HTTP 通信的場景。對(duì)于其他協(xié)議(如 TCP、UDP 等),可能需要使用不同的技術(shù)和類庫來實(shí)現(xiàn)。此外,使用 HttpListener 創(chuàng)建的服務(wù)器通常是單線程的,因此在高并發(fā)的情況下,可能需要進(jìn)行性能優(yōu)化或考慮使用其他技術(shù)來提高并發(fā)處理能力。FXQ28資訊網(wǎng)——每日最新資訊28at.com

FXQ28資訊網(wǎng)——每日最新資訊28at.com

官網(wǎng)的示例代碼FXQ28資訊網(wǎng)——每日最新資訊28at.com

下面是服務(wù)端一個(gè)實(shí)現(xiàn)代碼:FXQ28資訊網(wǎng)——每日最新資訊28at.com

using Newtonsoft.Json;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Net;using System.Text;using System.Threading.Tasks;namespace CustomHttpServer{    public class HttpServerService    {        private static bool isExcute = true;        private static HttpListener listener = new HttpListener();        public static void Start()        {           //單獨(dú)開啟一個(gè)線程執(zhí)行監(jiān)聽消息            System.Threading.ThreadPool.QueueUserWorkItem(w => Excute());        }        private static void Excute()        {            if (HttpListener.IsSupported)            {                if (!listener.IsListening)                {                   //添加需要監(jiān)聽的url                    listener.Prefixes.Add("http://127.0.0.1:8888/");                     //開始監(jiān)聽端口,接收客戶端請(qǐng)求                    listener.Start();                 }                while (isExcute)                {                    try                    {                        //阻塞主函數(shù)至接收到一個(gè)客戶端請(qǐng)求為止  等待請(qǐng)求                        HttpListenerContext context = listener.GetContext();                        //解析請(qǐng)求                        HttpListenerRequest request = context.Request;                        //構(gòu)造響應(yīng)                        HttpListenerResponse response = context.Response;                        string httpMethod = request.HttpMethod?.ToLower();                        string rawUrl = request.RawUrl;                        var Url = request.Url;                        if (httpMethod == "get")                        {                            //獲取查詢參數(shù)                            var queryString = request.QueryString;                            //TODO 其他操作                        }                        else if (httpMethod == "post")                        {                           // TODO 處理請(qǐng)求體數(shù)據(jù)                             var reader = new StreamReader(request.InputStream);                            var questBody = reader.ReadToEnd();                            if (!string.IsNullOrEmpty(rawUrl))                            {                               //TODO 反序列化RequestBody,調(diào)用其他業(yè)務(wù)                            }                        }                        var responseString = string.Empty;                        responseString = JsonConvert.SerializeObject(new { code = 1, msg = "發(fā)送成功" });                        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);                        //對(duì)客戶端輸出相應(yīng)信息.                        response.ContentLength64 = buffer.Length;                        //發(fā)送響應(yīng)                        using (System.IO.Stream output = response.OutputStream)                        {                            output.Write(buffer, 0, buffer.Length);                        }                    }                    catch (Exception exceotion)                    {                        string str = exceotion.Message;                    }                }            }            else            {                // TODO  系統(tǒng)不支持HttpListener            }        }        public static void Stop()        {            isExcute = false;            if (listener.IsListening)                listener.Stop();        }    }}

WPF客戶端調(diào)用:FXQ28資訊網(wǎng)——每日最新資訊28at.com

/// <summary>    /// App.xaml 的交互邏輯    /// </summary>    public partial class App : Application    {        public App()        {            HttpServerService.Start();        }    }

Windows服務(wù)調(diào)用:FXQ28資訊網(wǎng)——每日最新資訊28at.com

protected override void OnStart(string[] args){  HttpServerService.Start();}protected override void OnStop(){  //停止監(jiān)聽  HttpServerService.Stop();}

作為文件服務(wù)器的應(yīng)用。FXQ28資訊網(wǎng)——每日最新資訊28at.com

using System;using System.IO;using System.Net;namespace FileServerDemo{    public class FileServer    {        private static FileServer _instance;        private HttpListener _listener;        private string _rootDirectory;        private FileServer()        {            _rootDirectory = @"C:/Files/"; // 指定文件根目錄        }        public static FileServer Instance        {            get            {                if (_instance == null)                {                    _instance = new FileServer();                }                return _instance;            }        }        public void Start()        {            if (_listener != null && _listener.IsListening)            {                throw new InvalidOperationException("File server is already running.");            }            string url = "http://localhost:8080/";            try            {                _listener = new HttpListener();                _listener.Prefixes.Add(url);                _listener.Start();                Console.WriteLine($"File Server is running. Listening on {url}");                while (true)                {                    HttpListenerContext context = _listener.GetContext();                    HttpListenerRequest request = context.Request;                    HttpListenerResponse response = context.Response;                    string filePath = Path.Combine(_rootDirectory, request.Url.LocalPath.TrimStart('/'));                    if (File.Exists(filePath))                    {                        byte[] buffer = File.ReadAllBytes(filePath);                        response.ContentType = GetContentType(filePath);                        response.ContentLength64 = buffer.Length;                        response.OutputStream.Write(buffer, 0, buffer.Length);                        response.OutputStream.Close();                    }                    else                    {                        response.StatusCode = (int)HttpStatusCode.NotFound;                        response.Close();                    }                }            }            catch (Exception ex)            {                Console.WriteLine($"Error: {ex.Message}");            }        }        public void Stop()        {            if (_listener != null && _listener.IsListening)            {                _listener.Stop();                _listener.Close();                _listener = null;                Console.WriteLine("File Server stopped.");            }        }        private string GetContentType(string filePath)        {            string extension = Path.GetExtension(filePath).ToLower();            switch (extension)            {                case ".txt":                    return "text/plain";                case ".html":                    return "text/html";                case ".css":                    return "text/css";                case ".js":                    return "application/javascript";                case ".jpg":                case ".jpeg":                    return "image/jpeg";                case ".png":                    return "image/png";                default:                    return "application/octet-stream";            }        }    }}

在上述示例代碼中,我們展示了如何使用 HttpListener 類構(gòu)建一個(gè)簡單的文件服務(wù)器。通過監(jiān)聽指定的 URL,并在接收到請(qǐng)求時(shí)返回對(duì)應(yīng)的文件內(nèi)容,我們可以實(shí)現(xiàn)一個(gè)基本的文件服務(wù)功能。FXQ28資訊網(wǎng)——每日最新資訊28at.com

社區(qū)也有很多案例介紹

FXQ28資訊網(wǎng)——每日最新資訊28at.com

總之,HttpListener是一個(gè)強(qiáng)大而靈活的類,可以用于創(chuàng)建基于HTTP協(xié)議的服務(wù)器應(yīng)用程序。它提供了豐富的功能和靈活的配置選項(xiàng),能夠輕松地處理HTTP請(qǐng)求和響應(yīng)。通過深入了解HttpListener的用法和特性,就可以更好地利用它的優(yōu)勢,來提供高效、可靠的網(wǎng)絡(luò)服務(wù)。因此,如果您正在開發(fā)基于HTTP的應(yīng)用程序,不妨考慮使用HttpListener來實(shí)現(xiàn)您的需求。FXQ28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-75296-0.html了解HttpListener:用于創(chuàng)建基于HTTP協(xié)議的桌面&amp;Web應(yīng)用程序

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 基于內(nèi)存和 Redis 的兩級(jí) Java 緩存框架

下一篇: Lighthouse —— 優(yōu)秀的網(wǎng)頁性能分析工具

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美在线视频网站| 一本到高清视频免费精品| 国产精品分类| 国产精品久久久久国产a级| 国产精品资源在线观看| 一区免费在线| 99re66热这里只有精品3直播| 亚洲视频在线二区| 久久成人免费网| 男人的天堂亚洲| 欧美高清一区二区| 国产精品国产三级国产专播品爱网 | 欧美aa在线视频| 欧美色中文字幕| 国产视频综合在线| 亚洲人成在线播放网站岛国| 亚洲视频axxx| 久久人人超碰| 国产精品高潮久久| 在线播放中文一区| 亚洲一区在线直播| 另类春色校园亚洲| 国产精品麻豆欧美日韩ww | 亚洲精品美女久久久久| 亚洲欧美成人网| 欧美a级片网站| 国产精品蜜臀在线观看| 亚洲国产成人精品久久| 午夜精品福利在线| 欧美成人三级在线| 国产精品乱人伦中文| 亚洲国产视频一区二区| 午夜视频精品| 欧美日韩高清在线观看| 激情久久久久久| 亚洲伊人一本大道中文字幕| 蜜桃av一区二区在线观看| 国产精品亚洲视频| 日韩小视频在线观看| 久久久久国产精品www| 国产精品第一页第二页第三页| …久久精品99久久香蕉国产| 亚洲欧美日韩在线不卡| 欧美日韩国产一区精品一区| 在线观看欧美日韩国产| 欧美一区二区三区啪啪| 欧美三级精品| 亚洲伦伦在线| 欧美 日韩 国产一区二区在线视频 | 欧美性一区二区| 亚洲国产视频一区| 久久视频在线免费观看| 国产美女一区| 在线综合亚洲| 欧美理论电影网| 亚洲国产成人高清精品| 久久久精品国产免大香伊 | 国产精品美女www爽爽爽| 亚洲精品美女久久7777777| 久久综合伊人77777尤物| 国产视频久久| 午夜精品久久久久久久99樱桃| 欧美日韩一区二区三区免费看| 亚洲高清不卡一区| 久久人人超碰| 黄网动漫久久久| 久久久久久9| 国产亚洲激情视频在线| 亚洲免费在线观看| 国产精品v欧美精品v日韩精品| 日韩一级免费观看| 欧美另类极品videosbest最新版本| 亚洲国产导航| 毛片基地黄久久久久久天堂| 精品9999| 麻豆精品一区二区av白丝在线| 韩日精品视频| 久久久97精品| 精品福利av| 久久综合色婷婷| 亚洲国产高清一区| 欧美成人午夜激情视频| 亚洲国产精品一区二区www| 麻豆久久精品| 亚洲欧洲偷拍精品| 欧美人成免费网站| 一区二区三区 在线观看视| 欧美日韩一二三区| 亚洲婷婷在线| 国产精品女主播在线观看| 亚洲免费网址| 国产午夜精品福利| 久久激情网站| 在线精品国精品国产尤物884a| 久久综合久久久久88| 亚洲黄色性网站| 欧美区视频在线观看| 亚洲一区二区三区视频| 国产精品日韩在线观看| 欧美一区二区三区另类| 狠狠久久亚洲欧美专区| 男人的天堂亚洲| 亚洲毛片在线免费观看| 欧美日韩色综合| 亚洲欧美国产日韩天堂区| 国产日韩欧美二区| 久久久五月天| 亚洲精品午夜| 国产精品久久久一区二区| 欧美中文字幕久久| 亚洲风情在线资源站| 欧美精品在线免费| 亚洲一区二区三区视频播放| 国产亚洲精品久久久久婷婷瑜伽| 老色批av在线精品| 99香蕉国产精品偷在线观看| 国产精品网站在线观看| 久久久免费观看视频| 91久久夜色精品国产九色| 欧美午夜精品久久久久免费视 | 久久精品视频导航| 亚洲激情综合| 国产精品成人免费精品自在线观看| 欧美一站二站| 最新国产成人在线观看| 国产精品草草| 久久夜色精品国产| 一区二区三区.www| 国产三级精品在线不卡| 欧美成人性生活| 亚洲欧美日韩国产精品| 亚洲盗摄视频| 国产精品va在线播放| 久久久久久网| 宅男噜噜噜66一区二区| 国一区二区在线观看| 欧美日韩国产三区| 午夜精品一区二区三区在线| 亚洲国产欧美一区| 国产毛片一区| 欧美精品三级日韩久久| 欧美在线日韩精品| 亚洲免费av电影| 国产主播一区二区三区| 欧美日韩精品一区二区三区四区| 久久大逼视频| 国产精品99久久不卡二区| 在线成人性视频| 欧美色另类天堂2015| 久热精品视频| 午夜亚洲福利在线老司机| 亚洲精品社区| 韩国三级电影久久久久久| 欧美午夜电影在线| 蜜臀av国产精品久久久久| 香蕉免费一区二区三区在线观看| 亚洲精品国产精品国产自| 国内揄拍国内精品少妇国语| 欧美三级不卡| 免费91麻豆精品国产自产在线观看| 先锋影音久久| 亚洲网站在线| 亚洲精品中文字幕有码专区| 激情亚洲一区二区三区四区| 国产精品尤物福利片在线观看| 欧美人牲a欧美精品| 快she精品国产999| 欧美在线视频二区| 亚洲午夜激情网页| 日韩网站在线| 亚洲韩国一区二区三区| 一区精品在线| 国产一区二区日韩精品| 国产精品视频最多的网站| 欧美日韩免费观看一区二区三区| 免费成人高清视频| 久久精品国产99国产精品| 亚洲在线视频免费观看| 一本色道久久综合亚洲精品按摩| 亚洲国产精品尤物yw在线观看| 狠狠色伊人亚洲综合网站色| 国产欧美在线| 国产精品一区二区三区免费观看| 欧美日韩亚洲高清| 欧美女人交a| 欧美紧缚bdsm在线视频| 欧美成人69av| 男人的天堂亚洲在线| 欧美a级片网站| 奶水喷射视频一区| 欧美a级在线| 欧美不卡在线视频| 欧美h视频在线| 蜜乳av另类精品一区二区| 久久亚洲午夜电影| 久久久久国产精品人| 久久精品日韩一区二区三区| 久久福利一区| 久久精品国产第一区二区三区| 欧美资源在线观看| 久久精品在线视频| 久久久久国产精品午夜一区| 久久久欧美精品| 蜜臀久久99精品久久久久久9|