搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
不正经
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
OpenHarmony快速入门_app_feature_init(hello_world);
2
组件化开发——支付中心_支付组件化
3
mysql物业管理系统设计_Java开发物业管理系统:数据库表单设计
4
android 提高启动速度慢,提高App的启动速度,你真的做对了吗?
5
Visual Studio 2008 每日提示(十三)_vs中工具箱选择作为选项卡式文档停靠怎么恢复
6
虚幻引擎集成web前端<二>:UE4 像素流 与 web 通信_vue 虚幻webui
7
【RabbitMQ】Go语言实现六种消息中间件模型_golang消息队列中间件
8
axios请求requestBody和formData_axios构建request的body
9
六大通信库,围攻西门子_s7net开源库
10
华为交换机:ARP静态绑定技术_华为交换机arp绑定命令
当前位置:
article
> 正文
C#模拟IIS服务器(一)_c# iis服务器 gdal
作者:不正经 | 2024-03-16 21:50:53
赞
踩
c# iis服务器 gdal
为了更加透彻理解 IIS 服务器原理,自己简单模拟了IIS服务器工作原理,事实证明确实有助于理解!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 小型IIS服务器
{
using System.Net.Sockets;
using System.Net;
/// <summary>
/// 负责网站socket的监听
/// </summary>
public class IISWebServer
{
#region 1.0 定义变量
//定义服务器端监听socket
Socket serverSocket;
//服务器IP地址
string ip;
//服务器端口号
int port;
//定义action泛型委托 传递一个方法进来 为txtRequestStr赋值 将客户端请求报文 显示出来
Action<string> displayMsg;
//是否继续循环 用于监听和响应
bool isStop = false;
#endregion
#region 2.0 构造函数实例化 ip port 传进方法 给txtRequestStr赋值
/// <summary>
/// 无参构造方法
/// </summary>
public IISWebServer() { }
/// <summary>
/// 有参构造方法
/// </summary>
/// <param name="ip"></param>
/// <param name="port"></param>
/// <param name="displayMsg"></param>
public IISWebServer(string ip, int port, Action<string> displayMsg)
{
this.ip = ip;
this.port = port;
this.displayMsg = displayMsg;
}
#endregion
#region 3.0 启动IIS服务器的方法 入口 在Form1 btnStart_Click 方法中被调用
/// <summary>
/// 启动IIS服务器
/// </summary>
public void Start()
{
//01 实例化一个流式套接口
//使用IP4 IP地址 Stream流式套接口 TCP协议
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//02 给套接口绑定ip port
//IPEndPoint 将网络端点表示为 ip地址 和 端口号
//IPAddress 提供网际协议(IP)地址
//IPAddress.Parse(string ip) 让IP地址字符串转换为system.Net.IPAddress实例
//IPEndPoint(IPAddress.Parse(ip),port) 用指定的IP port 初始化system.Net.IPEndPoint的新实例
IPEndPoint ipp = new IPEndPoint(IPAddress.Parse(ip), port);
serverSocket.Bind(ipp);
//03 打开监听
serverSocket.Listen(20);
//04 开启线程等待浏览器的请求 由于AcceptCilent()会阻断主线程 所以开启子线程来接收客户端链接
System.Threading.Thread th = new System.Threading.Thread(AcceptCilent);
th.IsBackground = true; //该线程是否为后台线程
th.Start();
}
#endregion
#region 4.0 等待浏览器向服务器请求
/// <summary>
/// 等待浏览器向服务器请求
/// </summary>
private void AcceptCilent()
{
while (!isStop)
{
try
{
//开启服务器之后 代码执行到这就会停止 等待用户连接 一旦连接 就继续往下执行
//01 浏览器已发出请求 就会触发Accept()方法
Socket cSocket = serverSocket.Accept();
//02 监听到浏览器发出请求后 定义一个子线程 用来接收请求报文
//子线程 因为ReceiveCilent()方法会阻断主线程 所以开辟子线程实现接收用户请求报文
//当前线程只负责与当前浏览器通信
//System.Threading.ParameterizedThreadStart(ReceiveCilent) ReceiveCilent在线程上执行的方法
System.Threading.Thread thReceive = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(ReceiveCilent));
thReceive.IsBackground = true;
//开启线程时将当前的cSocket传给ReceiveCilent 因为每个线程的cSocket不一样
thReceive.Start(cSocket);
}
catch { }
}
}
#endregion
#region 5.0 接收浏览器的请求报文 在第4.0步被调用
/// <summary>
/// 接收浏览器的请求报文
/// </summary>
private void ReceiveCilent(object cSocket)
{
//因为每次浏览器向服务器请求时 cSocket不同,所以要转换为Socket型
//当前线程只负责和当前浏览器通信 每个线程都会传一个cSocket进来 每个线程的cSocket不一样 所以tmpSocket所存储的变量不同
//所以在这里要转型
Socket tmpSocket = cSocket as Socket;
//申请1M的空间来存储请求报文信息
byte[] receiveBuffer = new byte[1024 * 1024];
string requestString = string.Empty;
while (!isStop)
{
try
{
//代码执行到这也会停止 等待用户的请求报文
int len = tmpSocket.Receive(receiveBuffer);
//接收浏览器请求报文数据
//1.0 将请求报文数据转换为字符串赋值给requestString
requestString = System.Text.Encoding.UTF8.GetString(receiveBuffer, 0, len);
//tmpSocket.Receive(receiveBuffer);
//2.0 将浏览器请求报文在txtReceiveStr中显示
displayMsg(requestString);
//3.0 将请求报文送往ASP.NET框架处理机制
byte[] responseByte = IsApiRuntime.ProcessRequest(requestString);
//4.0 通过浏览器的连接套接字tmpSocket 的Send方法将响应报文数据反馈给浏览器
tmpSocket.Send(responseByte);
}
catch
{
}
}
}
#endregion
}
}
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/不正经/article/detail/252210
推荐阅读
article
C#
开发
上位
机
应用
的
一些选择...
前言1、 WASDK(WinUI 3)github:https://github.com/microsoft/Windo...
赞
踩
article
鸿蒙
系统
中
的
TableLayout
网格
布局
_
鸿蒙
中
ability
中
如何引用
布局
...
文章目录前言前期准备创建页面tableLayout
的
使用定义
布局
定义text组件
的
样式定义text组件模拟器显示如下:设...
赞
踩
article
Android
入门实例三
注册
界面的设计与实现_
android
做
一个
注册
页面
实验报告
...
注册
界面的设计与实现1.简介这次小实验通过RadioButton(单选按钮)、CheckBox(复选框)等组件实现一些个...
赞
踩
article
java.sql.SQLException: No
operations
allowed
after
...
最近申请了一个jsp空间,该空间支持mysql,以及一些框架。刚开始的时候一切正常,但是当把本地程序上传到该空间一段时间...
赞
踩
article
GSConnect
GNOME
扩展
连接你的
ubuntu
和
android
_gs
connect
...
GNOME
扩展
,
GSConnect
是 KDE Connect 协议的
GNOME
Shell 实现, 可以与 Na...
赞
踩
article
从零开始
的
数据挖掘
课复习(预习)_
相似性
的
最小值
通常
为
0...
数据一个数据对象代表一个实体(entity)。数据对象又称
为
样本、实例、数据点、或对象。数据对象用属性(attribut...
赞
踩
article
【
操作系统
】
启动
篇_
qemu
软盘
启动
msdn
...
对于编程路上各个阶段的人来说,
操作系统
无疑都是神秘而富有吸引力的。我们所看到的
操作系统
就像一座冰山,冰山之下的秘密令人向...
赞
踩
article
微信
小
程序
:有
条件
的展示
卡片
_
微信
小
程序
按
条件
显示
组件...
需求:当公告的发布时间
小
于当前时间的话才做
显示
思维偏差:第一我把该
条件
写在了子组件
卡片
的位置,这显然是不成立的;第二我居...
赞
踩
article
鸿蒙
实战
开发
:
【
FaultLoggerd
组件】讲解...
Faultloggerd部件是OpenHarmony中C/C++运行时崩溃临时日志的生成及管理模块。面向基于 Rust ...
赞
踩
article
【
Hilt
】【
kotlin
】IllegalStateException: Unsupported m...
问题:在
kotlin
+java混合项目中接入
Hilt
后编译时报错如下:Execution failed for task...
赞
踩
article
[
Linux
][
VM
虚拟机
]另外一台
主机
连
自己
主机
的
VM
虚拟机
...
第一次遇到这个问题,
自己
尝试解决
的
过程很头疼但是最终还是解决完成,很有成就感,上述过程和理解思路都是个人想法,因个人知识...
赞
踩
article
在Android Studio3.0以上使用
Java
8 语言功能_
android
studio
...
针对使用(包括在源代码中或通过依赖项使用)
Java
8 语言功能的每个模块,在其 build.gradle 文件中添加以...
赞
踩
article
有
哪些
AI
写作
软件?安利
这
7
款
,
轻松
拿捏
写作
王...
作为视频界的杠把子
,
新CG儿-Newcger在业内可谓是无人不知了
,
作为一个免费的视频模板
,
视频素材下载网站
,
不仅提供了...
赞
踩
article
kali
系统
ping
解析
域名
巨慢,
nslookup
解析
域名
失败_
kail
域名
解析
暂时失败...
kali
系统出现浏览器访问不了百度,疑似网络无法连接,但是可以
ping
通网关。并且在使用
ping
域名
的时候巨慢,nslo...
赞
踩
article
Android
的
多渠道
打包
,看完全都会了
_
android
多渠道
打包
...
//productFlavors是
android
节点
的
一个自节点。你需要打什么渠道
的
包,就在这里按umeng
的
要求用渠道...
赞
踩
article
网络
编程套
接字
...
linux 服务器端代码#include
#include
#include
[详细]
-->
赞
踩
article
JavaScript
进阶
学习笔记_
javascript
数组
进阶
...
@[TOC]
JavaScript
进阶
学习笔记
JavaScript
的特点及组成
JavaScript
的特点解释执行整个网页是...
赞
踩
article
语法5:
try
-
捕获
异常
_
try
捕获
异常
...
Python学习-
try
捕获
异常
:基础格式、结构子句、except子句、else子句、finally子句、结构嵌套
_
t...
赞
踩
article
基于
微信
小
程序
美术馆
预约
系统
(源码+文档+包运行)...
今天带来的是
基于
微信
小
程序
的
美术馆
预约
系统
,目前移动互联网技术已经十分成熟,那么通过借助
微信
小
程序
技术构建的数字化的美术...
赞
踩
article
【
操作系统
原理
要点
笔记 附带
英文
词汇】
_
操作系统
英文
术语
...
Command-Line(CLI),GraphicsUserInterface(GUI),Batch命令行(CLI)、图...
赞
踩
相关标签
c#
wpf
windows
microsoft
开发语言
android
布局
checkbox
radiobutton
google
c3p0
服务器
jsp
数据库
server
linux
ubuntu
GSConnect
数据挖掘
操作系统
微信小程序
小程序
harmonyos
华为