基于TcpListener实现最简单的http服务器
最近实现一套简单的网络程序。为了查看程序内部的变量,方便调试。就在想搞一个最最简单的方式。第一个想到写文件,日志。这个不实时,而且打开麻烦,pass 。于是想到用网络输出。本来是想写成c/s模式,想着写client端也麻烦。
就不能用浏览器吗?于是想起,http协议。
http协议,是基于文本的网络传输协议,协议简单。在这里,忽略请求内容。不管浏览器请求什么内容,服务器都输出我的变量内容。只要一个页面,不需要考虑其它,只要能显示。
那就开始上代码:
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading; namespace HttpTest
{
class HttpServer
{
private bool _isRunning;
private readonly int _port;
private TcpListener _tcpListener; public HttpServer(int port)
{
_port = port;
} public void Run()
{
_isRunning = true; _tcpListener = new TcpListener(IPAddress.Any, _port);
_tcpListener.Start(); while (_isRunning)
{
TcpClient client;
try
{
client = _tcpListener.AcceptTcpClient();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
break;
} Thread thread = new Thread(StartNewConnection);
thread.IsBackground = true;
thread.Start(client);
}
} public void Stop()
{
_isRunning = false;
try
{
_tcpListener.Stop();
}
catch
{ }
} private void StartNewConnection(object obj)
{
TcpClient client = (TcpClient)obj; NetworkStream stream = client.GetStream(); const int bufferLength = 10240;
byte[] buffer = new byte[bufferLength]; //管它是什么,没有解析http请求。
stream.Read(buffer, 0, bufferLength); byte[] content = GetContent();
stream.Write(content, 0, content.Length);
stream.Flush();
client.Close();//简单处理,关了。
} private byte[] GetContent()
{
StringBuilder http = new StringBuilder(); http.AppendLine("HTTP/1.0 200 OK");//这些字,就代表了是http协议。
http.AppendLine("Content-type:text/html");
http.AppendLine("Connection:close"); StringBuilder html = new StringBuilder(); html.AppendLine("<html>");
html.AppendLine("<head>");
html.AppendLine("<title>hello</title>");
html.AppendLine("</head>");
html.AppendLine("<body>");
html.AppendLine("Hello world!");
html.AppendLine("</body>");
html.AppendLine("</html>"); http.AppendLine("Content-Length:" + html.Length);//重要。
http.AppendLine();
http.AppendLine(html.ToString()); return Encoding.UTF8.GetBytes(http.ToString());
}
}
}
然后调用
using System;
using System.Threading; namespace HttpTest
{
class Program
{
static void Main(string[] args)
{
int port = 8088;
HttpServer server = new HttpServer(port);
Thread thread = new Thread(server.Run);
thread.IsBackground = true;
thread.Start();
Console.WriteLine("服务启动成功,访问:http://127.0.0.1:" + port + "/");
Console.ReadKey(); server.Stop(); }
}
}
就这么简单。
实现过程遇到的几个问题,在这里记录。
1 Content-Lenght 是指 内容的长度。客户端(浏览器)根据这个值来判断数据是否接收完成。所以,这个应该是指转成byte的长度。在上面的程序中,直接使用字符串的长度。
2 头和html之间要空一行。
初次写网络程序(tcp), 欢迎大家拍砖,坐稳了。
基于TcpListener实现最简单的http服务器的更多相关文章
- 基于 Java NIO 实现简单的 HTTP 服务器
1.简介 本文是上一篇文章实践篇,在上一篇文章中,我分析了选择器 Selector 的原理.本篇文章,我们来说说 Selector 的应用,如标题所示,这里我基于 Java NIO 实现了一个简单的 ...
- 基于python创建一个简单的HTTP-WEB服务器
背景 大多数情况下主机资源只有开发和测试相关人员可以登录直接操作,且有些特定情况"答辩.演示.远程"等这些场景下是无法直接登录主机的.web是所有终端用户都可以访问了,解决了人员权 ...
- 基于TcpListener的web服务器
写在前面 上篇文章根据<asp.net 本质论>书上提供的例子,实现了一个简单的web服务器,本篇文章将介绍另一种实现方式——基于TcpListener的web服务器. TcpListen ...
- 基于python2【重要】怎么自行搭建简单的web服务器
基本流程:1.需要的支持 1)python本身有SimpleHTTPServer 2)ForkStaticServer.py支持,该文件放在python7目录下 3)将希望共享 ...
- 转:【专题十二】实现一个简单的FTP服务器
引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...
- 专题十二:实现一个简单的FTP服务器
引言: 在本专题中将和大家分享如何自己实现一个简单的FTP服务器.在我们平时的上网过程中,一般都是使用FTP的客户端来对商家提供的服务器进行访问(上传.下载文件),例如我们经常用到微软的SkyDriv ...
- 自己动手模拟开发一个简单的Web服务器
开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...
- 基于Java Mina框架的部标808服务器设计和开发
在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...
- MQTT协议的简单介绍和服务器的安装
最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽. MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP ...
随机推荐
- 让Windows 8 / 8.1 以及 Windows Server 2012 / 2012 R2的任务管理器的性能面板,显示磁盘数据
运行[diskperf -y],关闭任务管理器,重新打开即可.
- 快速构建Windows 8风格应用12-SearchContract概述及原理
原文:快速构建Windows 8风格应用12-SearchContract概述及原理 本篇博文主要介绍Search Contract概述.Search Contract面板结构剖析.Search Co ...
- Android从无知到有知——NO.4
因为我们做的是手机安全卫士,因此,我们需要一个地图定位功能,些相关的项目,也有一些教程.到百度官方下载了相关的jar包和API,但自己建项目的时候却不是那么顺利,bug不断,弄得心烦意乱,最后最终臣服 ...
- SQLServer访问Oracle查询性能问题解决
原文:SQLServer访问Oracle查询性能问题解决 1. 问题 系统有个模块,需要查询Oracle数据库中的数据.目前是通过建立链接服务器实现的. SQLServer访问Oracle实现 可参考 ...
- codeforces #257 C称号Jzzhu and Chocolate
职务地址:http://codeforces.com/contest/450/problem/C 这次CF的时候绝壁脑残了. ..A题和C题都出现了脑残失误... 唯一一个AC的B题还是被HACK了. ...
- 【从0开始Tornado网站】主页登录和显示的最新文章
日志首页只能放置在它,这里的美,该<form>使用bootstrap的form-inline修改后的类,例如以下列方式: 前台代码例如以下: {%extends 'main.html'%} ...
- zepto.js的基本介绍与使用
最近看到了一篇文章,是介绍一种新的js框架,名为zepto.js,他适用于移动设备已经桌面浏览器除了ie系列的.. 他兼容jquery的API,所以学起来或用起来并不吃力.他比jquery的优势在于1 ...
- 几乎没用到过的css 样式
1. :focus 选择器用于选取获得焦点的元素. 案例:http://www.w3school.com.cn/tiy/t.asp?f=css_sel_focus 2. clearfix清除浮动闭合 ...
- MobileProbe的使用
MobileProbe是CNZZ移动这块统计的一个产品,目前似乎分成了基础版和专业版.下载地址为: http://m.cnzz.com/?a=main&m=download&f=inf ...
- 关于覆盖Object中的hashCode, equals和toString
最近在看<Effective Java>,里面看到了关于重载hashCode.equals和toString方法的篇章,顿时觉得视野开拓了不少,而且正结合自己工作.项目中的实例,觉得有必要 ...