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方法. 今天在写的时候,遇到一枚很 ...
随机推荐
- 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 ...
- sublime text2 安装less2css插件
之前一直用PhpStorm,功能十分强大,各种插件也有,不过比较占内存,有时候,左边的项目列表都刷不出来,今天又出现了这个问题,于是果断换sublime了. 由于项目中要用less编译,所以得装个le ...
- ubuntu下rhythmbox歌名显示乱码问题解决
问题描述:本人装有双系统,一个是win7,另一个是ubuntu12.04LTS版本,所有的歌曲都在windows磁盘下KuGou目录中,这个时候,使用ubuntu的rhythmbox播放的歌曲的时候, ...
- 谁占了我的端口 for Windows
这篇文章发布于我的 github 博客:原文 今天在本地调试 Blog 的时候意外的出现了一些错误:127.0.0.1 4000 端口已经被其他的进程占用了.如何找到占用端口的进程呢? Configu ...
- VS2013的 Browser Link 引起的问题
环境:vs2013 问题:在调用一个WebApi的时候出现了错误: 于是我用Fiddler 4直接调用这个WebApi,状态码是200(正常的),JSon里却提示在位置9409处文本非法, 以Text ...
- RequireJS与Backbone简单整合
前言 昨天我们一起学习了Backbone,最后做了一个备忘录的例子,说是做了不如说是看了下官方提供的例子,所以最终我感觉我们还是没能掌握Backbone,今天还得做个其它例子先. 然后前面也只是草草学 ...
- php语言
<?php//单行注释/*多行注释*///弱类型语言//var a=10;//php定义变量/*$a =10; //变量名前加$$b="hello";var_dump($a) ...
- Ajax_02之XHR发起异步请求
1.Ajax: AJAX:Asynchronous Javascript And Xml,异步的JS和XML: 同步请求:地址栏输入URL.链接跳转.表单提交-- 异步请求:使用Ajax发起,底层使用 ...
- JS函数无响应
自己定义了一个函数,比如说叫 addClass(),当按钮单击的时候响应 在添加了一些第三方Open JS API后就没反应了 原因分析:在代码没变动的情况下,很有可能是自己定义的函数名和第三方的冲突 ...
- LINQ系列:Linq to Object分组操作符
分组是指根据一个特定的值将序列中的值或元素进行分组.LINQ只包含一个分组操作符:GroupBy. GroupBy 1>. 原型定义 public static IQueryable<IG ...