0x01 写在前面

0x02 Http协议

0x03 TCP/IP

0x04 看代码

0x05 总结

0x01 写在前面

  由于工作中,经常需要在服务器之间,或者进程之间进行通信,分配任务等。用Socket操作,太麻烦了,需要建立连接,处理消息。所以

准备创建一个Socket模拟Http服务器的帮助类,来直接通过WebClient进行调用。

0x02 Http协议

我的理解:http协议,其实就是依托于tcp/ip的一个协议,也是可以通过socket发送消息,只是说。发送的内容格式满足http的条件,就可以被理解成http协议。

常用Http头。 Http版本也是可以写成1.1的。

  1. HTTP/1.0 OK
  2. Content-Type: text/html
  3. Connection: keep-alive
  4. Content-Encoding: utf-

0x03 TCP/IP

我的理解:TCP/IP协议其实是某一类协议的大分类了,很多协议都是基于这个协议来传递消息的。更详细的信息,自己搜索一下。

0x04 看代码

SocketHttpHelper.cs  socket模拟http帮助类

  1. public class SocketHttpHelper
  2. {
  3. private string ip = "127.0.0.1";
  4. private int port = ;
  5. private int count = ;
  6. private Socket server = null;
  7.  
  8. public string DefaultReturn = string.Empty;
  9.  
  10. public event Func<string, string, string> Handler = null;
  11.  
  12. public SocketHttpHelper()
  13. {
  14. }
  15.  
  16. public SocketHttpHelper(string ip, int port)
  17. {
  18. this.ip = ip;
  19. this.port = port;
  20. }
  21.  
  22. public void StartListen(int count = )
  23. {
  24. this.count = count;
  25. Thread t = new Thread(new ThreadStart(ProcessThread));
  26. t.IsBackground = true;
  27. t.Start();
  28. }
  29.  
  30. public void CloseSocket()
  31. {
  32. try
  33. {
  34. server.Close();
  35. }
  36. catch { }
  37. }
  38.  
  39. private void ProcessThread()
  40. {
  41. server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  42. server.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ip), port));
  43. server.Listen(count);
  44. while (true)
  45. {
  46. try
  47. {
  48. Socket client = server.Accept();
  49. ThreadPool.QueueUserWorkItem(new WaitCallback(ListenExecute), client);
  50. }
  51. catch { }
  52. finally
  53. {
  54. }
  55. }
  56. }
  57.  
  58. private void ListenExecute(object obj)
  59. {
  60. Socket client = obj as Socket;
  61. try
  62. {
  63. string ip = (client.RemoteEndPoint as System.Net.IPEndPoint).Address.ToString();
  64. byte[] buffer = new byte[];
  65. int count = client.Receive(buffer);
  66. if (count > )
  67. {
  68. string content = Encoding.UTF8.GetString(buffer, , count);
  69.  
  70. // 解析 content
  71. Regex actionRegex = new Regex(@"GET\s+/(?<action>\w+)\?(?<args>[^\s]{0,})");
  72. string action = actionRegex.Match(content).Groups["action"].Value;
  73. string args = actionRegex.Match(content).Groups["args"].Value;
  74. string headStr = @"HTTP/1.0 200 OK
  75. Content-Type: text/html
  76. Connection: keep-alive
  77. Content-Encoding: utf-8
  78.  
  79. ";
  80. if (Handler != null)
  81. {
  82. try
  83. {
  84. string result = Handler(action, args);
  85. string data = string.Format(headStr + result);
  86. client.Send(Encoding.UTF8.GetBytes(data));
  87. }
  88. catch { }
  89. finally
  90. {
  91. }
  92. }
  93. else
  94. {
  95. string data = string.Format(headStr + DefaultReturn);
  96. client.Send(Encoding.UTF8.GetBytes(data));
  97. }
  98. }
  99. }
  100. catch { }
  101. finally
  102. {
  103. try
  104. {
  105. client.Shutdown(SocketShutdown.Both);
  106. client.Close();
  107. client.Dispose();
  108. }
  109. catch { }
  110. }
  111. }
  112. }

0x05 总结

由于,每次都要从Socket开始写,写多了才发现,原来需要写一个公用类,点都不费时间。

C# Socket 模拟http服务器帮助类的更多相关文章

  1. 第一篇 先用socket模拟web服务器

    一.用socket来模拟网站访问 socket为python2.7 #!/usr/bin/env python # -*- coding:utf-8 -*- import socket def han ...

  2. Socket模拟Web服务器

    效果如下: 源码下载地址:https://github.com/doyoulaikeme/DotNetSample/tree/master/DotNetSample3/SocketWebServer

  3. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  4. PHP+SOCKET 模拟HTTP请求

    HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: ...

  5. 模拟web服务器 (小项目) 搭建+部署

    模拟web服务器:可以从浏览器中访问到自己编写的服务器中的资源,将其资源显示在浏览器中. 技术选型: corejava 线程池 同任务并发执行 IO流 传递数据 客户端也会像服务端发送数据, 服务器像 ...

  6. C#中使用Socket请求Web服务器过程

    最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...

  7. 详谈socket请求Web服务器过程

    最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...

  8. 【socket】Socket的三个功能类TCPClient、TCPListener 和 UDPClient

    Socket的三个功能类TCPClient.TCPListener 和 UDPClient (转) 应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制 ...

  9. Python socket模拟HTTP请求

    0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很 ...

随机推荐

  1. New Year's resolution for 2016

    A New Year's resolution is a traditional for me to celebrate a new beginning. For the past year, I h ...

  2. sublime text2 安装less2css插件

    之前一直用PhpStorm,功能十分强大,各种插件也有,不过比较占内存,有时候,左边的项目列表都刷不出来,今天又出现了这个问题,于是果断换sublime了. 由于项目中要用less编译,所以得装个le ...

  3. ubuntu下rhythmbox歌名显示乱码问题解决

    问题描述:本人装有双系统,一个是win7,另一个是ubuntu12.04LTS版本,所有的歌曲都在windows磁盘下KuGou目录中,这个时候,使用ubuntu的rhythmbox播放的歌曲的时候, ...

  4. 谁占了我的端口 for Windows

    这篇文章发布于我的 github 博客:原文 今天在本地调试 Blog 的时候意外的出现了一些错误:127.0.0.1 4000 端口已经被其他的进程占用了.如何找到占用端口的进程呢? Configu ...

  5. VS2013的 Browser Link 引起的问题

    环境:vs2013 问题:在调用一个WebApi的时候出现了错误: 于是我用Fiddler 4直接调用这个WebApi,状态码是200(正常的),JSon里却提示在位置9409处文本非法, 以Text ...

  6. RequireJS与Backbone简单整合

    前言 昨天我们一起学习了Backbone,最后做了一个备忘录的例子,说是做了不如说是看了下官方提供的例子,所以最终我感觉我们还是没能掌握Backbone,今天还得做个其它例子先. 然后前面也只是草草学 ...

  7. php语言

    <?php//单行注释/*多行注释*///弱类型语言//var a=10;//php定义变量/*$a =10; //变量名前加$$b="hello";var_dump($a) ...

  8. Ajax_02之XHR发起异步请求

    1.Ajax: AJAX:Asynchronous Javascript And Xml,异步的JS和XML: 同步请求:地址栏输入URL.链接跳转.表单提交-- 异步请求:使用Ajax发起,底层使用 ...

  9. JS函数无响应

    自己定义了一个函数,比如说叫 addClass(),当按钮单击的时候响应 在添加了一些第三方Open JS API后就没反应了 原因分析:在代码没变动的情况下,很有可能是自己定义的函数名和第三方的冲突 ...

  10. LINQ系列:Linq to Object分组操作符

    分组是指根据一个特定的值将序列中的值或元素进行分组.LINQ只包含一个分组操作符:GroupBy. GroupBy 1>. 原型定义 public static IQueryable<IG ...