三种方法构建简单的WEB服务器!
你可以将生成的EXE文件拷贝到服务器上,这样通过任意的WEB浏览器都可以获得该服务器的时间。
这是一个仅仅显示服务器时间的WEB服务器,通过Socket、TcpListener、HttpListener三种方式实现,稍加修改可以作为其他应用。
基本代码如下:三种方法实现的简单WEB服务器下载源代码
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
/// <summary>
/// 程序目标:设计一个WEB服务器,向客户端输出服务器的当前时间。
/// 设计思想:
/// 构造socketServer对象监听本机的某端口,此处为7788。
/// 收到客户端连接请求,打印请求信息。
/// 获得本机时间,以HTTP协议格式回应客户端请求。
/// 调试:
/// 用netstat -ano 查看端口使用情况
/// </summary>
namespace myIIS
{
class Program
{
static void Main(string[] args)
{
//IIS_Socket();
//IIS_TcpListener();
IIS_HttpListener();
}
private static void IIS_HttpListener()
{
if (!HttpListener.IsSupported)
{
throw new System.InvalidOperationException("HttpListener必须为Windows XP SP2 或 Server2003 以上系统运行!");
}
string endpoint = "http://127.0.0.1:7788/";
HttpListener httpLlisener = new HttpListener();
httpLlisener.Prefixes.Add(endpoint);
httpLlisener.Start();
Console.Write("WEB服务器正在监听 {0}",endpoint);
while (true)
{
//GetContext导致线程阻塞,直到请求到达
HttpListenerContext context = httpLlisener.GetContext();
//HttpListenerRequest request = context.Request;
//HttpListenerResponse对象的Content属性设置
HttpListenerResponse response = context.Response;
string body = string.Format(
"<html><head><title>From Socket Server</title></head>" +
"<body><h2>Server Time:{0}</h2></body></html>",
System.DateTime.Now);
response.ContentLength64 = System.Text.Encoding.UTF8.GetByteCount(body);
response.ContentType = "text/html; charset=UTF-8";
System.IO.Stream outputStream = response.OutputStream;
System.IO.StreamWriter writer = new System.IO.StreamWriter(outputStream);
writer.Write(body);
writer.Close();
if (Console.KeyAvailable)
break;
}
httpLlisener.Stop();
}
/// <summary>
/// TcpLisener、TcpClient、NetworkStream
/// </summary>
private static void IIS_TcpListener()
{
IPAddress address = IPAddress.Loopback;
IPEndPoint endpoint = new IPEndPoint(address, 7788);
System.Net.Sockets.TcpListener tcpListener = new System.Net.Sockets.TcpListener(endpoint);
tcpListener.Start();
Console.WriteLine("WEB服务器监听中{0}\t……",endpoint);
while (true)
{
System.Net.Sockets.TcpClient tcpClient = tcpListener.AcceptTcpClient();
System.Net.Sockets.NetworkStream ns = tcpClient.GetStream();
byte[] buffer = new byte[4096];
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
int length = ns.Read(buffer, 0, buffer.Length);
string request = utf8.GetString(buffer, 0, length);
Console.WriteLine("WEB客户端请求信息:\n{0}", request);
byte[] responseStatusBytes = utf8.GetBytes("HTTP/1.1 200 OK\r\n");
byte[] responseBodyBytes = utf8.GetBytes(string.Format(
"<html><head><title>From Socket Server {0}</title></head>" +
"<body><h2>Server Time:{1}</h2></body></html>",
endpoint.Address, System.DateTime.Now));
byte[] responseHeaderBytes = utf8.GetBytes(string.Format("Content-Type: text/html;" +
"charset=UTF-8\r\nContent-length:{0}\r\n", responseBodyBytes.Length));//responseBody.Length
ns.Write(responseStatusBytes, 0, responseStatusBytes.Length);
ns.Write(responseHeaderBytes, 0, responseHeaderBytes.Length);
ns.Write(new byte[] { 13, 10 }, 0, 2);
ns.Write(responseBodyBytes, 0, responseBodyBytes.Length);
tcpClient.Close();
if (Console.KeyAvailable)
break;
}
tcpListener.Stop();
}
/// <summary>
/// Socket对象
/// </summary>
private static void IIS_Socket()
{
//构建IPAddress、IPEndPoint和Socket对象
System.Net.IPAddress address = System.Net.IPAddress.Any; //可以Loopback或其他
System.Net.IPEndPoint endPoint = new System.Net.IPEndPoint(address, 7788);
System.Net.Sockets.Socket socketServer = new System.Net.Sockets.Socket(
System.Net.Sockets.AddressFamily.InterNetwork,
System.Net.Sockets.SocketType.Stream,
System.Net.Sockets.ProtocolType.Tcp);
socketServer.Bind(endPoint); //将Socket绑定到端口上
socketServer.Listen(10); //设置挂起链接队列的长度
Console.Write("WEB服务器正在监听 {0}", endPoint.Port);
while (true)
{
//Accept方法会阻塞线程执行,直到接到客户的连接请求,并返回请求连接的Socket对象
System.Net.Sockets.Socket socketClient = socketServer.Accept();
Console.Clear();
Console.WriteLine("\nWEB客户连接请求,来自 {0}", socketClient.RemoteEndPoint);
//开始读取客户的请求数据,转换为UTF8编码,并输出请求信息
byte[] buffer = new byte[4096];
int length = socketClient.Receive(buffer, buffer.Length, System.Net.Sockets.SocketFlags.None);
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
string request = utf8.GetString(buffer, 0, length);
Console.WriteLine("\n客户端请求信息\n{0}", request);
/*
[Client Established from 127.0.0.1:3438]
[Received Request Information From WEB Client]:
GET / HTTP/1.1
Host: 127.0.0.1:7788
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0) Gecko/20100101 Firefox/4
.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,* /*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cache-Control: max-age=0
*/
//--应答请求,为便于WEB客户端连接,构造HTTP协议体:状态行、回应体、回应头
string responseStatus = "HTTP/1.1 200 OK\r\n";
byte[] responseStatusBytes = utf8.GetBytes(responseStatus);
string responseBody = string.Format(
"<html><head><title>From Socket Server {0}</title></head>" +
"<body><h2>Server Time:{1}</h2></body></html>",
endPoint.Address, System.DateTime.Now);
byte[] responseBodyBytes = utf8.GetBytes(responseBody);
string responseHeader = string.Format("Content-Type: text/html;" +
"charset=UTF-8\r\nContent-length:{0}\r\n", responseBody.Length);
byte[] responseHeaderBytes = utf8.GetBytes(responseHeader);
//--向WEB客户的发送信息:回应状态行、回应头、空行、回应体
socketClient.Send(responseStatusBytes);
socketClient.Send(responseHeaderBytes);
socketClient.Send(new byte[] { 13, 10 });
socketClient.Send(responseBodyBytes);
socketClient.Close();
if (Console.KeyAvailable)
break;
}
socketServer.Close();
}
}
}
转载于:https://www.cnblogs.com/flaaash/archive/2011/04/09/2010663.html
三种方法构建简单的WEB服务器!相关推荐
- 使用Vue三种方法实现简单计算器
使用Vue三种方法实现简单计算器 代码实现了一个简单的计算器,用户可以在输入框中输入两个数字,选择一个操作符,并点击"等于"按钮,Vue.js会根据用户的输入进行计算,并将结果显示 ...
- 怎么给视频配音?短视频作者在用的三种方法,简单易操作
怎么给视频配音?短视频作者在用的三种方法,简单易操作 如果你也是做短视频的作者,那么相信你也一定知道,做短视频并不仅仅只是简单的拍摄剪辑发布而已,其中要做的工作还有很多,比如配音就是其中的一项.虽然并 ...
- 使用三种方法搭建虚拟机III Web网站的方法
实验环境:虚拟机Windows Server 2008(需先安装号IIS服务) IP:192.168.139.128测试环境:物理机Windows 10搭建虚拟主机网站的三种方法:方式一:两个网站同一 ...
- word流程图整体怎么拆分_word流程图-不会做流程图?这三种方法超级简单!
在平时的办公过程中,我们一定是要会做流程图的,因为很多地方都需要使用到流程图,下面小编教大家三种方法做流程图,非常简单,一看就会! 一,在Word中制作流程图 1,新建画布 首先点击"插入& ...
- 怎么用计算机要微信,电脑端要实现“微信双开”功能,三种方法,简单实用!...
在我们的日常生活中,微信它已经不仅仅是一个聊天工具了,我们的许多工作很多时候也离不开它. 有时我们想把生活和工作分开,很多人都有两个微信号,一个工作号一个生活号:工作号用于工作日的业务,生活号用于日常 ...
- 如何将文字转化为语音?三种方法超级简单,立刻就能学会!
是不是有很多小伙伴在剪辑视频时,想要把旁白给文字转成语音,因为可能会担心如果自己录制配音的话,自己普通话不标准.或者声音不好听,害怕会影响视频的质量.这时,智能文字转语音配音工具就派上用场了,输入文字 ...
- 清空数组的三种方法,简单直观
清空数组这的方法其实很简单,常见的有三种: 1. 给数组的length设置为0 arr.length = 0 前提是该语言中数组的length是可写可读. 2. 直接赋值为空数组 arr = [] 3 ...
- 拖动精灵的三种方法比较
构建Ball精灵: Ball.as package { import flash.display.Sprite; public class Ball extends Sprite ...
- 三种方法实现移动端HTTPS加速和省电
HTTPS网站的普及使大家更加关注HTTPS性能优化,一般做HTTPS优化可能只是针对PC端,在移动端的效果并不理想.去年Google就已经在移动端做了HTTPS的性能加速,为Android平台的Ch ...
最新文章
- Linux-NFS——配置过程
- 深入ASP.NET数据绑定(上)
- 采访 | Dou. 愿你背着相机出行,归来仍是少年。
- SAP OData etag flag setting in metadata MPC_EXT
- 面试中Handler这些必备知识点你都知道吗?面试真题解析
- 【数据结构与算法】【算法思想】贪心算法
- 列运算_DAX表操作基础第二招:增加列
- Latex 表格内文字过长自动换行 表格内单元格内容强制换行
- 漂亮的自适应宽度的多色彩CSS图片按钮
- 循环 计算数值的整数次幂
- OpenCV 文本显示 putText 和 getTextSize
- CASIA WebFace、WIDDER FACE、FDDB、AFLW、CelebA训练集详解
- Office之下拉字体选项名称为英文
- 在matlab使用矩阵的方法计算DFT
- echarts 背景颜色 渐变色,阴影效果
- erp软件的优点和用途
- 推荐这3款图片流动特效神器,一键即可让照片“动”起来
- JAVA 订单号生成类
- bcdedit添加linux引导,用BCDEdit编辑启动菜单
- 术语解释(PV、UV、QPS、TPS)
热门文章
- 怎么取消XP粘滞键(StickyKeys)
- 推荐好用的linux系统(manjaro)
- mysql exp 注入_使用exp进行SQL报错注入
- 判断语句_如何学好C语言判断语句?攻略if语句是第一步
- csgo 机器人模式_分享一个休闲模式机器人Bug
- Educational Codeforces Round 64 Div.2 D - 0-1-Tree
- 条码标签打印软件如何实现标签重复打印
- #react 之ant design Pro 学习研究#----启动项目
- 将EnyimMemcached从.NET Core RC1升级至RC2
- 让redhat5以yum方式安装软件