写在前面
上篇文章根据《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\r\n"; 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\r\nContent-Length: {0}\r\n", 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可以得到网络流,然后就可以对网络的输入和输出进行操作了,用起来更方便。