C# Socket 模拟http服务器帮助类
0x01 写在前面
由于工作中,经常需要在服务器之间,或者进程之间进行通信,分配任务等。用Socket操作,太麻烦了,需要建立连接,处理消息。所以
准备创建一个Socket模拟Http服务器的帮助类,来直接通过WebClient进行调用。
0x02 Http协议
我的理解:http协议,其实就是依托于tcp/ip的一个协议,也是可以通过socket发送消息,只是说。发送的内容格式满足http的条件,就可以被理解成http协议。
常用Http头。 Http版本也是可以写成1.1的。
HTTP/1.0 OK
Content-Type: text/html
Connection: keep-alive
Content-Encoding: utf-
0x03 TCP/IP
我的理解:TCP/IP协议其实是某一类协议的大分类了,很多协议都是基于这个协议来传递消息的。更详细的信息,自己搜索一下。
0x04 看代码
SocketHttpHelper.cs socket模拟http帮助类
public class SocketHttpHelper
{
private string ip = "127.0.0.1";
private int port = ;
private int count = ;
private Socket server = null; public string DefaultReturn = string.Empty; public event Func<string, string, string> Handler = null; public SocketHttpHelper()
{
} public SocketHttpHelper(string ip, int port)
{
this.ip = ip;
this.port = port;
} public void StartListen(int count = )
{
this.count = count;
Thread t = new Thread(new ThreadStart(ProcessThread));
t.IsBackground = true;
t.Start();
} public void CloseSocket()
{
try
{
server.Close();
}
catch { }
} private void ProcessThread()
{
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(ip), port));
server.Listen(count);
while (true)
{
try
{
Socket client = server.Accept();
ThreadPool.QueueUserWorkItem(new WaitCallback(ListenExecute), client);
}
catch { }
finally
{
}
}
} private void ListenExecute(object obj)
{
Socket client = obj as Socket;
try
{
string ip = (client.RemoteEndPoint as System.Net.IPEndPoint).Address.ToString();
byte[] buffer = new byte[];
int count = client.Receive(buffer);
if (count > )
{
string content = Encoding.UTF8.GetString(buffer, , count); // 解析 content
Regex actionRegex = new Regex(@"GET\s+/(?<action>\w+)\?(?<args>[^\s]{0,})");
string action = actionRegex.Match(content).Groups["action"].Value;
string args = actionRegex.Match(content).Groups["args"].Value;
string headStr = @"HTTP/1.0 200 OK
Content-Type: text/html
Connection: keep-alive
Content-Encoding: utf-8 ";
if (Handler != null)
{
try
{
string result = Handler(action, args);
string data = string.Format(headStr + result);
client.Send(Encoding.UTF8.GetBytes(data));
}
catch { }
finally
{
}
}
else
{
string data = string.Format(headStr + DefaultReturn);
client.Send(Encoding.UTF8.GetBytes(data));
}
}
}
catch { }
finally
{
try
{
client.Shutdown(SocketShutdown.Both);
client.Close();
client.Dispose();
}
catch { }
}
}
}
0x05 总结
由于,每次都要从Socket开始写,写多了才发现,原来需要写一个公用类,点都不费时间。
C# Socket 模拟http服务器帮助类的更多相关文章
- 第一篇 先用socket模拟web服务器
一.用socket来模拟网站访问 socket为python2.7 #!/usr/bin/env python # -*- coding:utf-8 -*- import socket def han ...
- Socket模拟Web服务器
效果如下: 源码下载地址:https://github.com/doyoulaikeme/DotNetSample/tree/master/DotNetSample3/SocketWebServer
- C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法
C#调用接口注意要点 在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...
- PHP+SOCKET 模拟HTTP请求
HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: ...
- 模拟web服务器 (小项目) 搭建+部署
模拟web服务器:可以从浏览器中访问到自己编写的服务器中的资源,将其资源显示在浏览器中. 技术选型: corejava 线程池 同任务并发执行 IO流 传递数据 客户端也会像服务端发送数据, 服务器像 ...
- C#中使用Socket请求Web服务器过程
最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...
- 详谈socket请求Web服务器过程
最开始我们需要明白一件事情,因为这是这篇文章的前提: HTTP协议只是一个应用层协议,它底层是通过TCP进行传输数据的.因此,浏览器访问Web服务器的过程必须先有“连接建立”的发生. 而有人或许会问: ...
- 【socket】Socket的三个功能类TCPClient、TCPListener 和 UDPClient
Socket的三个功能类TCPClient.TCPListener 和 UDPClient (转) 应用程序可以通过 TCPClient.TCPListener 和 UDPClient 类使用传输控制 ...
- Python socket模拟HTTP请求
0x00 起 最近在做一个对时间要求比较高的扫描器,需要封装一下SOCKET模拟HTTP发包的一些常用函数.简单的说,就是重写一下requests中的get.post方法. 今天在写的时候,遇到一枚很 ...
随机推荐
- 《Entity Framework 6 Recipes》中文翻译系列 (15) -----第三章 查询之与列表值比较和过滤关联实体
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-8与列表值比较 问题 你想查询一个实体,条件是给定的列表中包含指定属性的值. 解 ...
- JMeter--二、在Windows环境上搭建wordpress
为了学习使用JMeter,在Windows环境上搭建了wordpress. 使用JMeter录制或是编写登录worepress.编辑文章.删除文章的脚本. 首先了解一下wordpress是什么? Wo ...
- Spring学习记录(十一)---使用注解和自动装配
Spring支持用注解配置Bean,更简便. 上面的组件,是根据实际情况配的.比如写的一个类,是做业务处理的,那就用注解@Service表示服务层组件,以此类推.将整体分成不同部分. 要在xml加入c ...
- react-native环境搭建
目标平台 Android 开发平台 windows 开发环境安装建议:由于开发环境存在差异,建议参照react官网 或者react中文网 安装, react-native -- 在Windows下搭建 ...
- MVC 区域内默认控制器不能访问(Multiple types were found that match the controller named ‘Index')
异常处理汇总-后端系列 http://www.cnblogs.com/dunitian/p/4523006.html 错误信息 和主页的默认控制器冲突了,修改下Areas里面的默认控制器就可以了
- ClickOnce部署(3):使用证书
在讲述证书的使用前,我们先来了解另外一个知识——发布网页. 在前面所说的ClickOnce部署中,如果大家细心的话,应该会发现这么个问题. 如上图,发布成功后,在"输出"窗口中提示 ...
- 解密jQuery内核 DOM操作方法(二)html,text,val
回顾下几组DOM插入有关的方法 innerHTML 设置或获取位于对象起始和结束标签内的 HTML outerHTML 设置或获取对象及其内容的 HTML 形式 看图对照区别 innerText 设置 ...
- 深入学习jQuery鼠标事件
× 目录 [1]类型 [2]写法 [3]合成事件[4]鼠标按键[5]修改键[6]坐标位置 前面的话 鼠标事件是DOM事件中最常用的事件,jQuery对鼠标事件进行了封装和扩展.本文将详细介绍jQuer ...
- ScrollView中嵌套GridView,ListView只显示一行的解决办法
转载:http://blog.csdn.net/luohai859/article/details/39347583 关于为什么只显示一行,个人理解是:如果单独使用GridView和ListView, ...
- 【开源】OSharp框架解说系列(2.2):EasyUI复杂布局及数据操作
OSharp是什么? OSharp是个快速开发框架,但不是一个大而全的包罗万象的框架,严格的说,OSharp中什么都没有实现.与其他大而全的框架最大的不同点,就是OSharp只做抽象封装,不做实现.依 ...