最近实现一套简单的网络程序。为了查看程序内部的变量,方便调试。就在想搞一个最最简单的方式。第一个想到写文件,日志。这个不实时,而且打开麻烦,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服务器的更多相关文章

  1. 基于 Java NIO 实现简单的 HTTP 服务器

    1.简介 本文是上一篇文章实践篇,在上一篇文章中,我分析了选择器 Selector 的原理.本篇文章,我们来说说 Selector 的应用,如标题所示,这里我基于 Java NIO 实现了一个简单的 ...

  2. 基于python创建一个简单的HTTP-WEB服务器

    背景 大多数情况下主机资源只有开发和测试相关人员可以登录直接操作,且有些特定情况"答辩.演示.远程"等这些场景下是无法直接登录主机的.web是所有终端用户都可以访问了,解决了人员权 ...

  3. 基于TcpListener的web服务器

    写在前面 上篇文章根据<asp.net 本质论>书上提供的例子,实现了一个简单的web服务器,本篇文章将介绍另一种实现方式——基于TcpListener的web服务器. TcpListen ...

  4. 基于python2【重要】怎么自行搭建简单的web服务器

    基本流程:1.需要的支持     1)python本身有SimpleHTTPServer     2)ForkStaticServer.py支持,该文件放在python7目录下     3)将希望共享 ...

  5. 转:【专题十二】实现一个简单的FTP服务器

    引言: 休息一个国庆节后好久没有更新文章了,主要是刚开始休息完心态还没有调整过来的, 现在差不多进入状态了, 所以继续和大家分享下网络编程的知识,在本专题中将和大家分享如何自己实现一个简单的FTP服务 ...

  6. 专题十二:实现一个简单的FTP服务器

    引言: 在本专题中将和大家分享如何自己实现一个简单的FTP服务器.在我们平时的上网过程中,一般都是使用FTP的客户端来对商家提供的服务器进行访问(上传.下载文件),例如我们经常用到微软的SkyDriv ...

  7. 自己动手模拟开发一个简单的Web服务器

    开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的W ...

  8. 基于Java Mina框架的部标808服务器设计和开发

    在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...

  9. MQTT协议的简单介绍和服务器的安装

    最近公司做的项目中有用到消息推送,经过多方面的筛选之后确定了使用MQTT协议,相对于XMPP,MQTT更加轻量级,并且占用用户很少的带宽. MQTT是IBM推出的一种针对移动终端设备的基于TCP/IP ...

随机推荐

  1. 出现Deprecated: Function ereg_replace() is deprecated in 的原因及解决方法

    在 php5.3环境下运行oscommerce,常常会出现Deprecated: Function ereg() is deprecated in...和Deprecated: Function er ...

  2. SQLServer中处理每天四亿三千万记录

    我是如何在SQLServer中处理每天四亿三千万记录的   首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地 ...

  3. 工欲善其事:编辑器之神Vim(一)

    本篇文章收集了Vim最常用和实用的一些命令,掌握这些命令就可以使用Vim了 本文仅列举个人认为常用的命令,本系列文章更像是自己的学习笔记,而不是VIM使用教程. 如果你想了解vim的更多,可以看看Co ...

  4. 利用PhantomJS进行网页截屏

    利用PhantomJS进行网页截屏 关于PhantomJS PhantomJS 是一个基于WebKit的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速,原生支持各种W ...

  5. 深入了解jsonp解决跨域访问

    在这个项目中,我们做的充分利用jsonp这是一个特点跨界,完成简单的单点登录认证和权限控制的统一.道,各有各的优点.各有各的优点,选择什么方式实现全然取决于我们自己或者项目经理的开发经验,对各种框架的 ...

  6. JQuery Smart UI

    JQuery Smart UI 个人开发的一套使用htm+js的开发框架 SmartUI2.0后续声明 摘要: 感谢很多朋友关注,因为今年一直在另外一个公司做顾问,网络环境管制相当严格,所以一直没有更 ...

  7. java 学习List 的 add 与set差分法

    /** * 在List收集在许多方面.add(int index,Object obj)方法与set(int index,Object e)方法不易区分 * .通过以下实例.能够看出两个方法中的差别 ...

  8. java中接口之间的继承

    最近在读一些源码的时候突然发现了一个很神奇的东西,它的原始形态是这样的: 在这行代码中,BlockingDeque.BlockingQueue和Deque是三个接口.刚发现这个问题时,我是十分吃惊的, ...

  9. NPOI封装

    一.对于Excel的操作封装主要针对对于Excel的写入的封装,对于打印基类的封装主要引入了两个概念 1.打印区域模板类 2.打印集合类 如实例模板中需要打印的区域模块 如实例模板中需要打印的集合类 ...

  10. Prototype,创建型模式

    读书笔记_探索式测试_混合探索式测试   一.测试场景 1.讲述用户故事 2.描述需求 3.演示产品功能 4.演示集成场景 5.描述设置和安装 6.描述警告和出错情况 二.使用基于场景的探索式测试 1 ...