c#web服务器 虚拟目录,C#建立自己的Web服务器

C#建立自己的Web服务器

个人珍藏,仅为存档.今天整理磁盘,没处放.扔BLOG.

看不懂,别问我.自己研究.

webserver.cs

namespace cnnbsun.webserver

{

using System;

using System.IO;

using System.Net;

using System.Net.Sockets;

using System.Text;

using System.Threading ;

class MyWebServer

{

private TcpListener myListener ;

private int port = 8080 ; // 选者任何闲置端口

//开始兼听端口

//同时启动一个兼听进程

public MyWebServer()

{

try

{

//开始兼听端口

myListener = new TcpListener(port) ;

myListener.Start();

Console.WriteLine("Web Server Running... Press ^C to Stop...");

//同时启动一个兼听进程 'StartListen'

Thread th = new Thread(new ThreadStart(StartListen));

th.Start() ;

}

catch(Exception e)

{

Console.WriteLine("兼听端口时发生错误 :" +e.ToString());

}

}

public void SendHeader(string sHttpVersion, string sMIMEHeader, int iTotBytes, string sStatusCode, ref Socket mySocket)

{

String sBuffer = "";

if (sMIMEHeader.Length == 0 )

{

sMIMEHeader = "text/HTML"; // 默认 text/HTML

}

sBuffer = sBuffer + sHttpVersion + sStatusCode + "\r\n";

sBuffer = sBuffer + "Server: cx1193719-b\r\n";

sBuffer = sBuffer + "Content-Type: " + sMIMEHeader + "\r\n";

sBuffer = sBuffer + "Accept-Ranges: bytes\r\n";

sBuffer = sBuffer + "Content-Length: " + iTotBytes + "\r\n\r\n";

Byte[] bSendData = Encoding.ASCII.GetBytes(sBuffer);

SendToBrowser( bSendData, ref mySocket);

Console.WriteLine("Total Bytes : " + iTotBytes.ToString());

}

public void SendToBrowser(String sData, ref Socket mySocket)

{

SendToBrowser (Encoding.ASCII.GetBytes(sData), ref mySocket);

}

public void SendToBrowser(Byte[] bSendData, ref Socket mySocket)

{

int numBytes = 0;

try

{

if (mySocket.Connected)

{

if (( numBytes = mySocket.Send(bSendData, bSendData.Length,0)) == -1)

Console.WriteLine("Socket Error cannot Send Packet");

else

{

Console.WriteLine("No. of bytes send {0}" , numBytes);

}

}

else

Console.WriteLine("连接失败....");

}

catch (Exception e)

{

Console.WriteLine("发生错误 : {0} ", e );

}

}

public static void Main()

{

MyWebServer MWS = new MyWebServer();

}

public void StartListen()

{

int iStartPos = 0;

String sRequest;

String sDirName;

String sRequestedFile;

String sErrorMessage;

String sLocalDir;

/注意设定你自己的虚拟目录/

String sMyWebServerRoot = "E:\\MyWebServerRoot\\"; //设置你的虚拟目录

//

String sPhysicalFilePath = "";

String sFormattedMessage = "";

String sResponse = "";

while(true)

{

//接受新连接

Socket mySocket = myListener.AcceptSocket() ;

Console.WriteLine ("Socket Type " +mySocket.SocketType );

if(mySocket.Connected)

{

Console.WriteLine("\nClient Connected!!\n==================\nCLient IP {0}\n",mySocket.RemoteEndPoint) ;

Byte[] bReceive = new Byte[1024] ;

int i = mySocket.Receive(bReceive,bReceive.Length,0) ;

//转换成字符串类型

string sBuffer = Encoding.ASCII.GetString(bReceive);

//只处理"get"请求类型

if (sBuffer.Substring(0,3) != "GET" )

{

Console.WriteLine("只处理get请求类型..");

mySocket.Close();

return;

}

// 查找 "HTTP" 的位置

iStartPos = sBuffer.IndexOf("HTTP",1);

string sHttpVersion = sBuffer.Substring(iStartPos,8);

// 得到请求类型和文件目录文件名

sRequest = sBuffer.Substring(0,iStartPos - 1);

sRequest.Replace("\\","/");

//如果结尾不是文件名也不是以"/"结尾则加"/"

if ((sRequest.IndexOf(".") <1) && (!sRequest.EndsWith("/")))

{

sRequest = sRequest + "/";

}

//得带请求文件名

iStartPos = sRequest.LastIndexOf("/") + 1;

sRequestedFile = sRequest.Substring(iStartPos);

//得到请求文件目录

sDirName = sRequest.Substring(sRequest.IndexOf("/"), sRequest.LastIndexOf("/")-3);

//获取虚拟目录物理路径

sLocalDir = sMyWebServerRoot;

Console.WriteLine("请求文件目录 : " + sLocalDir);

if (sLocalDir.Length == 0 )

{

sErrorMessage = "

Error!! Requested Directory does not exists


";

SendHeader(sHttpVersion, "", sErrorMessage.Length, " 404 Not Found", ref mySocket);

SendToBrowser(sErrorMessage, ref mySocket);

mySocket.Close();

continue;

}

if (sRequestedFile.Length == 0 )

{

// 取得请求文件名

sRequestedFile = "index.HTML";

}

/

// 取得请求文件类型(设定为text/HTML)

/

String sMimeType = "text/HTML";

sPhysicalFilePath = sLocalDir + sRequestedFile;

Console.WriteLine("请求文件: " + sPhysicalFilePath);

if (File.Exists(sPhysicalFilePath) == false)

{

sErrorMessage = "

404 Error! File Does Not Exists...

";

SendHeader(sHttpVersion, "", sErrorMessage.Length, " 404 Not Found", ref mySocket);

SendToBrowser( sErrorMessage, ref mySocket);

Console.WriteLine(sFormattedMessage);

}

else

{

int iTotBytes=0;

sResponse ="";

FileStream fs = new FileStream(sPhysicalFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);

BinaryReader reader = new BinaryReader(fs);

byte[] bytes = new byte[fs.Length];

int read;

while((read = reader.Read(bytes, 0, bytes.Length)) != 0)

{

sResponse = sResponse + Encoding.ASCII.GetString(bytes,0,read);

iTotBytes = iTotBytes + read;

}

reader.Close();

fs.Close();

SendHeader(sHttpVersion, sMimeType, iTotBytes, " 200 OK", ref mySocket);

SendToBrowser(bytes, ref mySocket);

//mySocket.Send(bytes, bytes.Length,0);

}

mySocket.Close();

}

}

}

}

}

相关阅读:

MSSQL Server导入导出数据库方法小结

vbs选择文件夹效果代码

PHP正则汉字匹配,JS正则汉字匹配

JS加密编码算法代码

CSS3教程之CSS定位属性

Windows 7如何找回快速启动栏

正则表达式学习笔记

CSS基础教程之CSS边距属性

div层的移动及性能优化

C#上传文件大于4M的解决方法

新浪背投广告js代码

Oracle时间函数操作大全

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对象中multipartfile 空报错_Python 为什么会有个奇怪的“...”对象?

我想到一种特别的写法&#xff0c;很多人会把它当成 pass 语句的替代。在文章发布后&#xff0c;果然有三条留言提及了它。所谓特别的写法就是下面这个&#xff1a;# 用 ... 替代 passdef foo():...它是中文标点符号的半个省略号&#xff0c;也即由英文的 3 个点组成。如果你是…

XP硬盘安装Fedora14图文教程

XP硬盘安装Fedora14图文教程发表于&#xff1a;2010年11月03日 分类&#xff1a;Fedora 26 条评论 5,044 次阅读 昨天是Fedora 14的发布&#xff0c;这篇文章介绍的是如何在windows XP下硬盘安装Fedora 14。 之前写过2篇文章&#xff1a; Linux下硬盘安装Fedora 13&#xff1a;…

oracle使用sqlplus查询sql格式

连接sqlplus 显示表结构&#xff1a; desc acceptuser 列表显示表或者视图acceptuser 所有的列 Name Type id number value varchar(200) createdata date 输入命令: col id formate a10 //表示只显示10个宽度 不换行 col value format a…

用wamper打开php源码_php源码该怎么设置数据库

php源码该怎么设置数据库php源码修改数据库的设置方法&#xff1a;首先在源码中找到程序的配置文件&#xff1b;然后用文本编辑器打开&#xff1b;之后修改数据库地址、数据库名、用户名、连接密码、数据库前缀等参数&#xff1b;最后保存即可。这里以织梦程序为例&#xff0c;…

豆瓣评分9.0+,这几部纪录片看一部少一部!

纪录片是以真实生活为创作素材&#xff0c;以真人真事为表现对象&#xff0c;并对其进行艺术的加工与展现的&#xff0c;以展现真实为本质&#xff0c;并用真实引发人们思考的电影或电视艺术形式。好的纪录片就像打开了一扇新世界的大门&#xff0c;让我们了解更多世界的奇妙之…

记一次 .NET 某纺织工厂 MES系统 API 挂死分析

一&#xff1a;背景 1. 讲故事这个月中旬&#xff0c;有位朋友加我wx求助他的程序线程占有率很高&#xff0c;寻求如何解决&#xff0c;截图如下&#xff1a;说实话&#xff0c;和不同行业的程序员聊天还是蛮有意思的&#xff0c;广交朋友&#xff0c;也能扩大自己的圈子&#…

Windows7下注册OCX的注意事项

文章首发于&#xff1a;博客园 今天要测试一个几年前基于.NET Framework1.1做的软件在Window7下的工作情况&#xff0c;发现Windows7很体贴的已经默认安装了最新版的Framework3.5.1。程序跑的很顺畅&#xff0c;看来Win7的向下兼容性果然不错。 不过途中发现有一个用到的OCX控件…

获取iOS 设备上崩溃日志 (Crash Log)的方法

1. iTunes同步获取 大部分用户会使用iTunes软件来管理iPhone&#xff0c;这样同步的Crash日志就会同步到电脑上&#xff0c;我们需要在特定的路径里面查找 Mac OS X&#xff1a;~/Library/Logs/CrashReporter/MobileDevice 2. 使用第三方软件 &#xff1a; itools等 使用itool…

python求斜边上的高_直角三角形斜边上的高怎么求

展开全部 直角三角形斜边32313133353236313431303231363533e78988e69d8331333431336666上的高的求法&#xff1a; 1. 直角三角形斜边上的高等于两条直角边的乘积除以斜边的商。 例如&#xff1a;直角三角形的两个直角边分别为a和b&#xff0c;斜边为c&#xff0c;那么&#xff…

[设计模式]桥接模式

桥接模式可以把抽象类和实现类进行各自封装和扩展&#xff0c;目的在于解耦。由于桥接模式可以增强了组合性&#xff0c;我们可以很灵活地修改类&#xff0c;并且很好地重用。我们可以先看一下简单的片断&#xff1a; //这是一个演示简单的桥接模式片断(本例子只假设在标准浏览…

使用identity+jwt保护你的webapi(一)——identity基础配置

前言用户模块几乎是每个系统必备的基础功能&#xff0c;如果每次开发一个新项目时都要做个用户模块&#xff0c;确实非常无聊。好在asp.net core给我们提供了Identity&#xff0c;使用起来也是比较方便&#xff0c;如果对用户这块需求不是非常个性化的话&#xff0c;identity是…

四大金刚 数据结构_GIS技术在气象领域应用综述

GIS技术在气象领域应用综述李丹【摘要】摘要:地理信息系统即GIS具有数据分析、图形制作、预测等多方面的功能,在气象领域当中能够对气象数据进行实时采集-处理,从而为气象数据库提供强有力的技术支持。接下来,本文围绕GIS技术在气象领域应用进行论述,望具有一定的可参考价值。【…

年轻人不能“饥渴”太久,否则……

全世界只有3.14 % 的人关注了爆炸吧知识文 / 较高端人类来源 / 较高端人类&#xff08;ID&#xff1a;xinji656&#xff09;转发到朋友圈健康生活从饮水做起本文来源于微信公众号&#xff1a;较高端人类&#xff08;ID&#xff1a;xinji656&#xff09;我们只研究那些你感兴趣的…

Redis集群(一):集群搭建

2019独角兽企业重金招聘Python工程师标准>>> 概述 这里只记录操作步骤和集群测试&#xff0c;保证快速搭建集群环境。具体原理请查阅官方文档&#xff08;中文版&#xff09;&#xff1a; http://www.redis.cn/topics/cluster-spec.html 集群容灾&#xff1a;Redis集…

python优惠券机器人_python实现机器人卡牌

介绍 这个例子主要利用turtle库实现根据输入动态展示不同机器人的图像和属性信息。 代码部分非原创只是做了些许修改和整理使得更易阅读。 图片和文件资源请访问git仓库获取&#xff1a;链接地址 涉及以下知识点&#xff1a; 1.文件读取 2.字典 3.turtle库的使用 4.控制语句 实…

php imap模块的添加

问题说明&#xff1a;由于公司需要对发邮件而被退回的邮件进行处理&#xff0c;而在最初php并没有imap.so的扩展支持&#xff0c;所以需要添加新的扩展 系统环境&#xff1a;centos5.2&#xff0c;php是采用源码安装 由于早期添加过 soap的扩展&#xff08;我采用的是重新编译的…

使用identity+jwt保护你的webapi(二)——获取jwt token

前言上一篇已经介绍了identity在web api中的基本配置&#xff0c;本篇来完成用户的注册&#xff0c;登录&#xff0c;获取jwt token。开始开始之前先配置一下jwt相关服务。配置JWT 首先NuGet安装包&#xff1a;<PackageReference Include"Microsoft.AspNetCore.Authent…

假如,绿茶婊的目标变成女生......

1 假如绿茶的目标是女生▼2 也不知道我爹今晚回去要迎接怎样的狂风暴雨▼3 这撞衫撞得有点尴尬▼4 我是一个小胖子没事玩玩小肚子▼5 看起来也不傻可能就是单纯的有猫病▼6 在严肃场合努力憋笑的我▼7 妈妈&#xff1a;叫你吃饭不吃饭&#xff01;三请四请才肯来&#x…

使用Mutex實現單一程式執行個體的注意事項(转)

相信大家都知道在.NET程式中若要實現單一程式執行個體&#xff0c;一般來說有幾種方法&#xff0c;像是去判斷是否已經有開啟的Process是相同的程式、用Mutex與Semaphore之類的技術來判斷是否程式正在開啟。但是很多網路上的文章都忽略了在用Mutex實現單一程式執行個體時&#…

docker 启动mysql root用户_Docker-Compose搭建Wordpress博客系统

环境&#xff1a;CentOS 7.5Docker 20.10.2Docker-Compose 1.25.5[rootlocalhost ~]# cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core)[rootlocalhost ~]# docker version # Docker版本Client: Docker Engine - Community Version: 20.10.2…