.Net创建监听http请求服务
服务端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | class Program { static HttpListener httpobj; static void Main( string [] args) { //提供一个简单的、可通过编程方式控制的 HTTP 协议侦听器。此类不能被继承。 httpobj = new HttpListener(); //定义url及端口号,通常设置为配置文件 httpobj.Prefixes.Add( "http://+:8080/" ); //启动监听器 httpobj.Start(); //异步监听客户端请求,当客户端的网络请求到来时会自动执行Result委托 //该委托没有返回值,有一个IAsyncResult接口的参数,可通过该参数获取context对象 httpobj.BeginGetContext(Result, null ); Console.WriteLine($ "服务端初始化完毕,正在等待客户端请求,时间:{DateTime.Now.ToString()}\r\n" ); Console.ReadKey(); } private static void Result(IAsyncResult ar) { //当接收到请求后程序流会走到这里 //继续异步监听 httpobj.BeginGetContext(Result, null ); var guid = Guid.NewGuid().ToString(); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine($ "接到新的请求:{guid},时间:{DateTime.Now.ToString()}" ); //获得context对象 var context = httpobj.EndGetContext(ar); var request = context.Request; var response = context.Response; ////如果是js的ajax请求,还可以设置跨域的ip地址与参数 //context.Response.AppendHeader("Access-Control-Allow-Origin", "*");//后台跨域请求,通常设置为配置文件 //context.Response.AppendHeader("Access-Control-Allow-Headers", "ID,PW");//后台跨域参数设置,通常设置为配置文件 //context.Response.AppendHeader("Access-Control-Allow-Method", "post");//后台跨域请求设置,通常设置为配置文件 context.Response.ContentType = "text/plain;charset=UTF-8" ; //告诉客户端返回的ContentType类型为纯文本格式,编码为UTF-8 context.Response.AddHeader( "Content-type" , "text/plain" ); //添加响应头信息 context.Response.ContentEncoding = Encoding.UTF8; string returnObj = null ; //定义返回客户端的信息 if (request.HttpMethod == "POST" && request.InputStream != null ) { //处理客户端发送的请求并返回处理信息 returnObj = HandleRequest(request, response); } else { returnObj = $ "不是post请求或者传过来的数据为空" ; } var returnByteArr = Encoding.UTF8.GetBytes(returnObj); //设置客户端返回信息的编码 try { using ( var stream = response.OutputStream) { //把处理信息返回到客户端 stream.Write(returnByteArr, 0, returnByteArr.Length); } } catch (Exception ex) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($ "网络蹦了:{ex.ToString()}" ); } Console.ForegroundColor = ConsoleColor.Yellow; Console.WriteLine($ "请求处理完成:{guid},时间:{ DateTime.Now.ToString()}\r\n" ); } private static string HandleRequest(HttpListenerRequest request, HttpListenerResponse response) { string data = null ; try { var byteList = new List< byte >(); var byteArr = new byte [2048]; int readLen = 0; int len = 0; //接收客户端传过来的数据并转成字符串类型 do { readLen = request.InputStream.Read(byteArr, 0, byteArr.Length); len += readLen; byteList.AddRange(byteArr); } while (readLen != 0); data = Encoding.UTF8.GetString(byteList.ToArray(),0, len); //获取得到数据data可以进行其他操作 } catch (Exception ex) { response.StatusDescription = "404" ; response.StatusCode = 404; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($ "在接收数据时发生错误:{ex.ToString()}" ); return $ "在接收数据时发生错误:{ex.ToString()}" ; //把服务端错误信息直接返回可能会导致信息不安全,此处仅供参考 } response.StatusDescription = "200" ; //获取或设置返回给客户端的 HTTP 状态代码的文本说明。 response.StatusCode = 200; // 获取或设置返回给客户端的 HTTP 状态代码。 Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine($ "接收数据完成:{data.Trim()},时间:{DateTime.Now.ToString()}" ); return $ "接收数据完成" ; } } |
客户端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | class Program { static void Main( string [] args) { string operation; do { Console.WriteLine( "按任意键发送数据到服务端" ); Console.ReadLine(); var wc = new WebClient(); var url = "http://127.0.0.1:8080" ; Console.WriteLine($ "请求服务地址:{url},时间:{DateTime.Now.ToString()}" ); //模拟一个json数据发送到服务端 var data = new Data(1, "张三" ); var jsonModel = JsonConvert.SerializeObject(data); //发送到服务端并获得返回值 var returnInfo = wc.UploadData(url, Encoding.UTF8.GetBytes(jsonModel)); //把服务端返回的信息转成字符串 var str = Encoding.UTF8.GetString(returnInfo); Console.ForegroundColor = ConsoleColor.Cyan; Console.WriteLine($ "服务端返回信息:{str},时间:{DateTime.Now.ToString()}" ); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine($ "请问是否继续:继续 【y】,退出【n】" ); operation = Console.ReadLine(); } while (operation == "y" ); } class Data { public Data( int id, string name) { this .ID = id; this .Name = name; } public int ID { get ; set ; } public string Name { get ; set ; } } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南