手记

基于TcpListener的web服务器

写在前面

上篇文章根据《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可以得到网络流,然后就可以对网络的输入和输出进行操作了,用起来更方便。

0人推荐
随时随地看视频
慕课网APP