HTTP服务器开发教程
<![CDATA[
概述
最近因为项目需要,必须自己实现一个HTTP服务器的部分功能。
需求大概是这样的,winform里使用webrowser控件显示一个本地的html页面,同时winform启动http服务,本地html页面里通过javascript使用XMLHttpRequest对象向winform进行http通信,交互数据。
现在,该项目功能基本实现了,把HTTP服务器部分提取出来分享一下,并提供相关源码下载。
HTTP服务器开发教程
启动HTTP服务器代码,创建Socket侦听端口
public void Start(string ip = "127.0.0.1", int port = 80)
{
_IP = ip;
_Port = port;
Stop();
_Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ipaddress = IPAddress.Parse(_IP);
IPEndPoint endpoint = new IPEndPoint(ipaddress, _Port);
_Listener.Bind(endpoint);
_Listener.Listen(int.MaxValue);
_Thread = new Thread(new ThreadStart(ThreadHandler));
_Thread.Start();
}
开启一个线程,接收请求的Socket,并且用HttpRequest对象封装处理请求的Socket
private void ThreadHandler()
{
while (true)
{
Socket s = _Listener.Accept();
HttpRequest request = new HttpRequest(this, s);
request.Start();
}
}
每个HttpRequest开启一个新线程处理Socket的发送和接收
public void Start()
{
_Thread = new Thread(new ThreadStart(ThreadHandler));
_Thread.Start();
}
private void ThreadHandler()
{
if (_Server.TraceInConsole)
Console.WriteLine("Begin HttpRequest...");
try
{
while (true)
{
string receive = Receive();
if (!string.IsNullOrEmpty(receive))
{
_Server.ReadRequest(this, receive);
string response = _Server.GetResponse(this);
int write = Send(response);
_Server.ResponseFinished(this);
while (true)
{
Thread.Sleep(3000);
write = Send(HttpServer.BYTES_CRLF);
if (_Client == null)
break;
}
}
if (_Client == null)
break;
Thread.Sleep(1000);
}
}
catch (Exception ex)
{
if (_Server.TraceInConsole)
Console.WriteLine(ex.Message);
}
if (_Server.TraceInConsole)
Console.WriteLine("End HttpRequest...");
}
处理HTTP请求,默认是返回http404错误,在GetResponse添加自定义http处理
public virtual string GetResponse(HttpRequest request)
{
return ResponeNotFound(request.Version);
}
public string ResponeNotFound(string version)
{
return version + @" 404 Not Found
Content-Length: 0
Content-Type: text/plain
Server: Hunk's http server
Date: Fri, 06 Aug 2010 14:00:23 GMT
";
}
处理Socket关闭,TIME_WAIT状态
如果服务端的Socket比客户端的Socket先关闭,会导致客户端出现TIME_WAIT状态,占用系统资源。
服务端尝试发送数据,利用SocketExeception判断客户端Socket是否已关闭连接,然后关闭服务端Socket。
…
while (true)
{
Thread.Sleep(3000);
write = Send(HttpServer.BYTES_CRLF); //如果发送失败,_Client会被关闭并且设置为null
if (_Server.TraceInConsole)
Console.WriteLine("Try To End HttpRequest...");
if (_Client == null)
break;
}
…
注:只提点主要的位置,详细请下载源码。
HTTP服务器和客户端的效果图
源码下载地址
http://download.csdn.net/source/2602863
]]>
HTTP服务器开发教程相关推荐
- 最新《C++游戏服务器开发教程》
课程目录: ├─100-详解12 聊天室服务器02 网络库asio 14_recv.mkv ├─101-详解13 聊天室服务器对应的客户端 网络库asio 15_recv.mkv ├─102-详解14 ...
- 我的世界bukkit服务器开发教程第一章——开发环境
提示:如果图片看不见或者文字有乱码,请到我的网站:www.xiaoguaimao.cn 前言: 本教程共分为两个部分: 1.服务器插件开发 2.服务器专属启动器开发 如果你学过编程,那你会很轻松,如果 ...
- 我的世界服务器开发教程第三章——插件与vault挂钩并建立收费换皮肤GUI
提示:如果图片看不见或者文字有乱码,请到我的网站:www.xiaoguaimao.cn 前言:本章讲了如何把自己的插件与vault挂钩.如何控制物品栏.如何在本地存储信息以及拦截其他插件命令 首先,上 ...
- SAP UI5 应用开发教程之三十五 - 如何把本地开发的 SAP UI5 应用部署到 ABAP 服务器上试读版
一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...
- [教程] openmp/sa-mp联机服务器开发 零基础入门
前言: 开发服务器所需要使用的编程语言Pawn,联机服务器的一切玩法.内容.功能都需要我们自己编写创造,这意味着开始是一片空白. 创造一个成熟的服务器需要一定的技术和编程经验,如果你愿意学习探索,一步 ...
- 好教程推荐系列:张小方的《高性能服务器开发》以及《30天自制C++服务器》
张小方的<高性能服务器开发> 首先感谢技术达人张小方的原创资料分享!!!欢迎关注[高性能服务器开发]微信公众号 1.张小方整理的优质的C++后端开发进阶学习资料 CppGuide: 优质的 ...
- boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转
一:什么是st_asio_wrapper 它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_ ...
- 微信公众平台开发教程(九)微信公众平台通用开发框架
微信公众平台开发教程(九)微信公众平台通用开发框架 一.思考 开发了几个微信项目,一直在思考: 如何将微信相关的处理与业务系统联系在一起? 如何做到彼此分离,且易于扩展? 能否开发一套独立的微信服务框 ...
- Unity网络多玩家游戏开发教程(上册)
Unity网络多玩家游戏开发教程(上册) 试读文档下载地址:http://pan.baidu.com/s/1jGwwxam Unity作为强大的游戏开发平台,为网络游戏的的开发提供大量的组件和API. ...
最新文章
- MindSpore模型精度调优实践
- 框架页面jquery装载
- ehcache导致Tomcat重启出错
- svm中支持向量的理解
- 在下列计算机应用项目中,属于过程控制应用领域的是,计算机基础试题.ppt
- [HAOI2012]高速公路
- 企业级 SpringBoot 教程 (十四)在springboot中用redis实现消息队列
- Nginx 限制某 IP 在一段时间内对服务器发起请求的连接数
- pycharm编程工具自带python环境_Python IDE专用编辑器PyCharm下载及配置安装过程(Ubuntu环境)...
- debug工具_Hackintool for【黑】mac V3.4.4中文版 黑苹果必装工具箱
- 华为网络技术大赛笔记——服务器概述
- 飞控计算机的作用,自动飞控计算机测试系统
- 【AI简报20210716期】上海张江又一款AI芯发布、寒武纪切入自动驾驶芯片
- 5.雅思口语——别再用delicious food啦
- 【IDEA】idea插件的安装和删除
- (MY)SQL基本语句
- Java基础Day01-Java基础语法
- 鱼眼相机图像畸变校正
- 商人的诀窍 结构体
- uniapp ping插件 离线打包
热门文章
- CCNA-应试教育-思科网院-CCNAv7: Switching, Routing, and Wireless Essentials 交换、路由和无线基础。
- 微信支付SDK接入流程梳理
- scrollTop兼容性问题
- 第二阶段--团队冲刺--第三天
- 团队博客-第六周:Alpha阶段项目复审(科利尔拉弗队)
- leetcode/字符串交织,s1和s2字符串交织组成s3
- git学习笔记[idea整合GitHub,Gitee](非常详细)
- 苏轼《定风波》词两首
- Jquery实现表格动态增加一行,删除一行(最简洁的代码实现)
- OkHttp3-使用详解-OkHttpClient