写在前面
上篇文章根据《asp.net 本质论》书上提供的例子,实现了一个简单的web服务器,本篇文章将介绍另一种实现方式——基于TcpListener的web服务器。
TcpListener
命名空间System.Net.Sockets下的TcpListener类简化了基于tcp协议的监听程序。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.Net.Sockets; namespace TcpListenerWebServer { class Program { static void Main(string[] args) { //取得本机的loopback网络地址,即127.0.0.1 IPAddress ip = IPAddress.Loopback; //创建可以访问的网络端点,8888表示端口号 IPEndPoint endpoint = new IPEndPoint(ip, 8888); //初始化tcp监听器 /* * 传入监听的端点参数,通过构造函数初始化监听器, * 不再关注如何设置网络协议等细节, * 具体可以和上篇文章的方式进行对比。 */ TcpListener listener = new TcpListener(endpoint); //开启监听器 listener.Start(); //打印提示 Console.WriteLine("监听开始......"); while (true) { //AcceptTcpClient方法将阻塞进程,直到一个客户端的连接到达监听器,返回一个TcpClient类型的对象。可通过该对象与客户端进行通信 TcpClient client = listener.AcceptTcpClient(); Console.WriteLine("与客户端已经建立连接....."); //得到一个网络流,通过TcpClient可以得到一个用于输入和输出的网络流对象NetworkStream,对Socket的输入和输出进行了封装。 NetworkStream ns = client.GetStream(); //处理过程使用utf8 进行编码 System.Text.Encoding utf8 = System.Text.Encoding.UTF8; //设置用于接收的字节数组 byte[] buffer = new byte[4096]; int length = ns.Read(buffer, 0, buffer.Length); //得到请求内容 string requestString = utf8.GetString(buffer, 0, length); //打印 Console.WriteLine(requestString); //回应的状态行 string statusLine = "HTTP/1.1 200 OK "; byte[] statusLineBuffer = utf8.GetBytes(statusLine); //准备发送到客户端的网页 string responseBody = "<html><head><title>这是一个web服务器的测试</title></head><body><h1>Hello World.</h1></body></html>"; byte[] responseBodyBuffer = utf8.GetBytes(responseBody); //回应的头部 string responseHeader = string.Format( "Content-Type:text/html;charset=UTF-8 Content-Length: {0} ", responseBodyBuffer.Length); byte[] responseHeaderBuffer = utf8.GetBytes(responseHeader); //响应状态行 ns.Write(statusLineBuffer, 0, statusLineBuffer.Length); //响应头部 ns.Write(responseHeaderBuffer, 0, responseHeaderBuffer.Length); //输出头部与内容之间的空行 ns.Write(new byte[] { 13, 10 }, 0, 2); //输出内容部分 ns.Write(responseBodyBuffer, 0, responseBodyBuffer.Length); //关闭与客户端的连接 client.Close(); break; } //关闭服务器监听 listener.Stop(); Console.Read(); } } }
启动服务器,并在浏览器中输入http://localhost:8888/
总结
TcpListener类,简化了对tcp协议的监听,通过TcpClient可以得到网络流,然后就可以对网络的输入和输出进行操作了,用起来更方便。