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

posted @ 2016-02-15 08:42  wolfy  阅读(1922)  评论(0编辑  收藏  举报