<![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服务器开发教程相关推荐

  1. 最新《C++游戏服务器开发教程》

    课程目录: ├─100-详解12 聊天室服务器02 网络库asio 14_recv.mkv ├─101-详解13 聊天室服务器对应的客户端 网络库asio 15_recv.mkv ├─102-详解14 ...

  2. 我的世界bukkit服务器开发教程第一章——开发环境

    提示:如果图片看不见或者文字有乱码,请到我的网站:www.xiaoguaimao.cn 前言: 本教程共分为两个部分: 1.服务器插件开发 2.服务器专属启动器开发 如果你学过编程,那你会很轻松,如果 ...

  3. 我的世界服务器开发教程第三章——插件与vault挂钩并建立收费换皮肤GUI

    提示:如果图片看不见或者文字有乱码,请到我的网站:www.xiaoguaimao.cn 前言:本章讲了如何把自己的插件与vault挂钩.如何控制物品栏.如何在本地存储信息以及拦截其他插件命令 首先,上 ...

  4. SAP UI5 应用开发教程之三十五 - 如何把本地开发的 SAP UI5 应用部署到 ABAP 服务器上试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 应用开发教程之一:Hello World SAP UI5 应用开发教程之二:SAP U ...

  5. [教程] openmp/sa-mp联机服务器开发 零基础入门

    前言: 开发服务器所需要使用的编程语言Pawn,联机服务器的一切玩法.内容.功能都需要我们自己编写创造,这意味着开始是一片空白. 创造一个成熟的服务器需要一定的技术和编程经验,如果你愿意学习探索,一步 ...

  6. 好教程推荐系列:张小方的《高性能服务器开发》以及《30天自制C++服务器》

    张小方的<高性能服务器开发> 首先感谢技术达人张小方的原创资料分享!!!欢迎关注[高性能服务器开发]微信公众号 1.张小方整理的优质的C++后端开发进阶学习资料 CppGuide: 优质的 ...

  7. boost.asio包装类st_asio_wrapper开发教程(2014.5.23更新)(一)-----转

    一:什么是st_asio_wrapper 它是一个c/s网络编程框架,基于对boost.asio的包装(最低在boost-1.49.0上调试过),目的是快速的构建一个c/s系统: 二:st_asio_ ...

  8. 微信公众平台开发教程(九)微信公众平台通用开发框架

    微信公众平台开发教程(九)微信公众平台通用开发框架 一.思考 开发了几个微信项目,一直在思考: 如何将微信相关的处理与业务系统联系在一起? 如何做到彼此分离,且易于扩展? 能否开发一套独立的微信服务框 ...

  9. Unity网络多玩家游戏开发教程(上册)

    Unity网络多玩家游戏开发教程(上册) 试读文档下载地址:http://pan.baidu.com/s/1jGwwxam Unity作为强大的游戏开发平台,为网络游戏的的开发提供大量的组件和API. ...

最新文章

  1. MindSpore模型精度调优实践
  2. 框架页面jquery装载
  3. ehcache导致Tomcat重启出错
  4. svm中支持向量的理解
  5. 在下列计算机应用项目中,属于过程控制应用领域的是,计算机基础试题.ppt
  6. [HAOI2012]高速公路
  7. 企业级 SpringBoot 教程 (十四)在springboot中用redis实现消息队列
  8. Nginx 限制某 IP 在一段时间内对服务器发起请求的连接数
  9. pycharm编程工具自带python环境_Python IDE专用编辑器PyCharm下载及配置安装过程(Ubuntu环境)...
  10. debug工具_Hackintool for【黑】mac V3.4.4中文版 黑苹果必装工具箱
  11. 华为网络技术大赛笔记——服务器概述
  12. 飞控计算机的作用,自动飞控计算机测试系统
  13. 【AI简报20210716期】上海张江又一款AI芯发布、寒武纪切入自动驾驶芯片
  14. 5.雅思口语——别再用delicious food啦
  15. 【IDEA】idea插件的安装和删除
  16. (MY)SQL基本语句
  17. Java基础Day01-Java基础语法
  18. 鱼眼相机图像畸变校正
  19. 商人的诀窍 结构体
  20. uniapp ping插件 离线打包

热门文章

  1. CCNA-应试教育-思科网院-CCNAv7: Switching, Routing, and Wireless Essentials 交换、路由和无线基础。
  2. 微信支付SDK接入流程梳理
  3. scrollTop兼容性问题
  4. 第二阶段--团队冲刺--第三天
  5. 团队博客-第六周:Alpha阶段项目复审(科利尔拉弗队)
  6. leetcode/字符串交织,s1和s2字符串交织组成s3
  7. git学习笔记[idea整合GitHub,Gitee](非常详细)
  8. 苏轼《定风波》词两首
  9. Jquery实现表格动态增加一行,删除一行(最简洁的代码实现)
  10. OkHttp3-使用详解-OkHttpClient