搜索
查看
编辑修改
首页
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
Mac系统用命令打开ping端口的方法_mac怎么测能不能ping通
2
v01.12 鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体? | 开篇致敬鸿蒙内核开发者_开源鸿蒙代码结构
3
Android源码解析--SystemServer启动流程_systemserver从哪里调用的
4
使用canvas在前端实现图片合成_前端canvas生成图片
5
Adobe Acrobat Pro DC 2023:提升工作效率,激发创意灵感 mac/win版
6
30分钟音频当数据,任何音色零门槛生成,产品免费体验
7
最新ChatGPT网站源码/支持用户注册付费套餐/支持Ai绘画/支持用户会员套餐/邀请分佣功能/支持后台一键更新/网站后台管理/永久更新_如何搭建chatgpt镜像网站收费
8
【鸿蒙开发】第十六章 ArkTS基础类库-容器(数据结构)
9
结合创新!11种多尺度特征融合方法,附论文和代码
10
Unity半透明特效原理讲解(为什么半透明设置渲染顺序和深度写入这么重要)_unity半透明深度
当前位置:
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
ptuning
v2
的
chatglm
垂直领域
训练
记录...
第二我要减小十倍
的
学习率,观察一下减小十倍
的
学习率能不能提升
ptuning
的
效果。基于终端
的
交互,基于简单界面
的
交互,基...
赞
踩
article
leetcode 30. Substring
with
Concatenation of All W...
30. Substring
with
Concatenation of All WordsYou are given a...
赞
踩
article
Kali
Linux
安装
教程
(亲测)...
Kali
Linux
安装
教程
(亲测):下载
Kali
Linux
镜像文件,选择稳定版并下载。
安装
完成后输入新的用户名和密码...
赞
踩
article
C#
实现
获取
IIS
站点及
虚拟
目录
信息的方法_iis下
获取
网站
目录
...
这篇文章主要介绍了
C#
实现
获取
IIS
站点及
虚拟
目录
信息的方法,可实现
获取
IIS
站点信息及物理路径等功能,具有一定参考借鉴...
赞
踩
article
LeetCode
算法系列:30.
Substring
with
Concatenation
of
A...
题目描述You are given a string, s, and a list
of
words, words, t...
赞
踩
article
Android
多
渠道
打包
三种方式_
android
.
applicationvariants
.all 怎...
前言:现在市场上很多app应用存在于各个不同的
渠道
,大大小小几百个,当我们想要在发布应用之后统计各个
渠道
的用户下载量,我...
赞
踩
article
终于用
HarmonyOS
跑出了
Hello
World
_
deveco
studio
预览区不显示...
在经历了大半个月的学习和失败,我一个完全零基础的小白,终于在上周四跑出了
Hello
World
,激动的心情难以言表。最...
赞
踩
article
富设备平台突破:基于
RK
3568
的
DAYU200
进入
OpenHarmony
3.1
Release
主...
近日,润和软件出品的 HH-SC
DAYU200
开发套件基于瑞芯微
RK
3568
芯片,代码已完成进入OpenAtom ...
赞
踩
article
springboot
健康
饮食
推荐
系统
的
设计
与实现-计算机毕设 附源码49517_
推荐
饮食
方案
的
代码
...
健康
饮食
推荐
系统从角色上划分为了注册用户以及管理员两种角色。管理员角色:(1)登录:管理员
的
账号是在数据表表中直接设置生...
赞
踩
article
kali
2016.2
安装
及配置...
之前
安装
过
kali
,现在换了台电脑重新
安装
一遍,顺便记录下来,因为面向新手所以会很详(luo)细(suo)
安装
:...
赞
踩
article
AI绘图实战(一):
制作
购物车
图标
icon
|
Stable
Diffusion
成为设计师生产力工具...
S:你安装
stable
diffusion
就是为了看小姐姐么?I :当然不是。在midjourney上
制作
icon
算是一...
赞
踩
article
uni
-
app
- App
打包
_
uni
app
打包
...
8、选择环境变量---->系统变量中的path(双击)进入----->右侧新建---->将刚刚安装地址复制到此。12、选...
赞
踩
article
渗透
测试
学习笔记(
1
)_
kali
rolling
...
渗透
测试
学习笔记(
1
)
1
.
kali
Rolling:Kali Rolling:是Kali 的即时更新版,只要Kali中有...
赞
踩
article
两台
电脑上的
虚拟机
socket
通信
_
两台
ubuntu
电脑之间怎么建立
tcp
通信
...
发现问题在学习Linux网络编程的时候,遇到了一个问题:使用
socket
实现网络
通信
的时候,我预想的是使用笔记本上的ub...
赞
踩
article
最新版
Android
studio
没有
layout
文件
解决方案_
android
studio
没有la...
而在最新版的empty activity上我们创建项目后是没有
layout
文件
的,下面的empty views acti...
赞
踩
article
鸿蒙
应用
开发
培训笔记03:
Ability
设计与
开发
_
ability
开发
...
通过这篇详尽的指南,读者将能够掌握HarmonyOS
Ability
开发
的核心技术,为构建高效、稳定的
鸿蒙
应用
打下坚实基...
赞
踩
article
Googlplay
应用
发布
(上架)流程,
有
图
有
现场_
google
修改
应用
签名
需要
权限...
第一次上传
应用
到
google
play时,踩了一些坑,避免其他人少走些弯路,整理了一份gp(
google
play)
发布
应用
...
赞
踩
article
网络安全
kali渗透
学习
web
渗透入门
WireShark
抓包
及常用协议分析_渗透需要
抓包
吗...
Wireshark是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。W...
赞
踩
article
使用
什么
工具
可以
做到
呢?
可以
列出
工具
和
操作
工具
的详细步骤...
有很多
工具
可以
帮助你完成这项任务,比如 Microsoft Word,Excel,PowerPoint,Google S...
赞
踩
article
2021
iOS
面试
题大全
---
全方面剖析
面试
(
一
)...
(
答案不唯
一
,仅供参考,文章最后有福利)
一
.
iOS
面试
题—UI相关:事件传递,图像显示,性能优化,离屏渲染UIView...
赞
踩
相关标签
深度学习
人工智能
机器学习
linux
金融
鸿蒙
物联网
iot
spring boot
java
python
课程设计
mysql
运维
开发工具
php
stable diffusion
ai
制图
icon
uni-app
前端
渗透测试
kali