C# 利用HttpListener监听处理Http请求

喜欢ヅ旅行 2022-07-16 01:20 382阅读 0赞

C# 利用HttpListener监听处理Http请求

(2014-05-15 11:25:11)

sg_trans.gif转载








  分类: C#

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Net;

using System.Net.Sockets;

using System.IO;

using System.Xml.Serialization;

using System.Threading;

using System.Web;

namespace ConsoleApplication3

{

  1. class Program
  2. \{
  3. static void Main(string\[\] args)
  4. \{
  5. try
  6. \{
  7. HttpListener listerner = new HttpListener();
  8. \{
  9. for (; true; )
  10. \{
  11. try
  12. \{
  13. Console.Write("请输入服务器IP地址:");
  14. string ip = Console.ReadLine();
  15. listerner.AuthenticationSchemes = AuthenticationSchemes.Anonymous;//指定身份验证 Anonymous匿名访问
  16. listerner.Prefixes.Add("http://" + ip + ":1500/AnsweringMachineService/");
  17. // listerner.Prefixes.Add("http://localhost/web/");
  18. listerner.Start();
  19. \}
  20. catch (Exception e)
  21. \{
  22. Console.WriteLine("未能成功连接服务器.....");
  23. listerner = new HttpListener();
  24. continue;
  25. \}
  26. break;
  27. \}
  28. Console.WriteLine("服务器启动成功.......");
  29. int maxThreadNum, portThreadNum;
  30. //线程池
  31. int minThreadNum;
  32. ThreadPool.GetMaxThreads(out maxThreadNum, out portThreadNum);
  33. ThreadPool.GetMinThreads(out minThreadNum, out portThreadNum);
  34. Console.WriteLine("最大线程数:\{0\}", maxThreadNum);
  35. Console.WriteLine("最小空闲线程数:\{0\}", minThreadNum);
  36. //ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc1), x);
  37. Console.WriteLine("\\n\\n等待客户连接中。。。。");
  38. while (true)
  39. \{
  40. //等待请求连接
  41. //没有请求则GetContext处于阻塞状态
  42. HttpListenerContext ctx = listerner.GetContext();
  43. ThreadPool.QueueUserWorkItem(new WaitCallback(TaskProc), ctx);
  44. \}
  45. con.Close();
  46. listerner.Stop();
  47. \}
  48. \}
  49. catch (Exception e)
  50. \{
  51. Console.WriteLine(e.Message);
  52. Console.Write("Press any key to continue . . . ");
  53. Console.ReadKey( );
  54. \}
  55. \}
  56. static void TaskProc(object o)
  57. \{
  58. HttpListenerContext ctx = (HttpListenerContext)o;
  59. ctx.Response.StatusCode = 200;//设置返回给客服端http状态代码
  60. string type = ctx.Request.QueryString\["type"\];
  61. string userId = ctx.Request.QueryString\["userId"\];
  62. string password = ctx.Request.QueryString\["password"\];

string filename = Path.GetFileName(ctx.Request.RawUrl);

string userName = HttpUtility.ParseQueryString(filename).Get(“userName”);//避免中文乱码

  1. //进行处理
  2. //使用Writer输出http响应代码
  3. using (StreamWriter writer = new StreamWriter(ctx.Response.OutputStream))
  4. \{
  5. writer.Write(“处理结果”);
  6. writer.Close();
  7. ctx.Response.Close();
  8. \}
  9. \}
  10. \}

}

Android客户端:

public static void Register(final Handler handler, final Context context,

final String userId, final String userName,final int groupId, final String password){

new Thread(new Runnable(){

  1. public void run() \{
  2. if(!CommonTools.checkNetwork(context))\{
  3. Message msg = new Message();
  4. msg.what = Signal.NETWORK\_ERR;
  5. handler.sendMessage(msg);
  6. return;
  7. \}
  8. try \{
  9. String content = "";
  10. **String tmp = java.net.URLEncoder.encode(userName, "utf-8"); //防止中文乱码**
  11. URL url = new URL(URL+"?type=Register&userId="+userId+"&password="+password+"&groupId="+groupId+"&userName="+tmp);
  12. // HttpURLConnection
  13. HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();
  14. if (httpconn.getResponseCode() == HttpURLConnection.HTTP\_OK) \{
  15. InputStreamReader isr = new InputStreamReader(httpconn.getInputStream(), "utf-8");
  16. int i;
  17. // read
  18. while ((i = isr.read()) != -1) \{
  19. content = content + (char) i;
  20. \}
  21. isr.close();
  22. \}
  23. //disconnect
  24. httpconn.disconnect();
  25. \} catch (Exception e) \{
  26. e.printStackTrace();
  27. \}
  28. \}//run

}).start();//thread

}

注意:

1.中文乱码问题

  1. 在客户端采用如下形式

String tmp = java.net.URLEncoder.encode(userName, “utf-8”); //防止中文乱码

服务器端

string filename = Path.GetFileName(ctx.Request.RawUrl);

string userName = HttpUtility.ParseQueryString(filename).Get(“userName”);//避免中文乱码


服务器端需要引入: using System.Web;

  1. 此时可能提示找不到库,则在项目右键添加引用找到 System.Web.dll勾选即可

2.[System.Net.HttpListenerException] = {“拒绝访问。”}问题

  1. 如果是win7或者win8,在cmd.exe上右键,以管理员身份运行,然后执行下面的命令
  2. netsh http add urlacl url=http://本机IP:1500/ user=用户名(如Administrator)

3.记得关闭防火墙,或者只开放指定端口,步骤如下:

  1. s tep1、点击控制面板

  
  step2、选择windows防火墙,点击高级设置
  
  step3、在弹出的“高级安全windows防火墙”点击“入站规则”,在右侧“操作”栏点击“入站规则”下的“新建规则…”,此时会弹出一个窗口让你设置。剩下的就非常傻瓜化了。
  
  step4、弹出“新建入站规则向导”-规则类型-选中“端口”,点击下一步。选择规则应用的协议“TCP/UDP”如果是TCP你就选择TCP,UDP就选择UDP。再勾选“特定本地端口”在文本框输入您想开放的端口号(例如1521)。
  
  step5、点击下一步,到“连接符合指定条件时应该进行什么操作?”选择“允许连接”。点击下一步到“配置文件”何时应用该规则,勾选“域”、“专用”、“公用”点击下一步。
  
  step6、配置规则名称,随便输入你自己认为好记的规则名称即可。

分享:

sg_trans.gif喜欢

阅读 评论 收藏 转载 喜欢 打印 举报





转载列表:

sg_trans.gif转载

转载是分享博文的一种常用方式…

前一篇: 【转】使用AutoCompleteTextView实现邮箱地址补全1

后一篇: C#访问 Access

发表评论

表情:
评论列表 (有 0 条评论,382人围观)

还没有评论,来说两句吧...

相关阅读