欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于Socket编程实现一个简单的Web服务器

程序员文章站 2024-03-20 16:35:46
...
1.代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace WebServer
{
    /// <summary>
    /// 使用Socket实现一个简单的Web服务器
    /// 该服务器向请求的浏览器返回一个静态的HTML
    /// 
    /// 这里只是简单实现了一个web服务器的功能,
    /// 当然实际的Web服务器通过用户的发来的Http请求中获得请求文件类型,
    /// 请求文件名以及请求目录等信息,
    /// 然后Web服务器根据这些请求信息从服务器的物理目录中寻找请求的文件,
    /// 如果在服务器中找到请求的文件,然后服务器把响应内容发送给客户端。
    /// 这里只是通过这个简单的Web服务器让大家理解请求/响应模型以及Web服务器的工作原理,
    /// 一些复杂的Web服务器也是在此基础进行一些其他功能的扩展。
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            //获得本机IP地址,即127.0.0.1
            IPAddress localaddress = IPAddress.Loopback;

            //创建可以访问的端点,49135表示端口号,如果这里设置为0,表示使用一个由系统分配的空闲端口号
            IPEndPoint endpoint = new IPEndPoint(localaddress, 49135);

            //创建Socket对象,使用IPv4地址,数据通信类型为数据流,传输控制协议为Tcp
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            //将Socket绑定到端点上
            socket.Bind(endpoint);

            //将Socket实例置于侦听状态,设置连接队列长度
            socket.Listen(10);

            while (true)
            {
                Console.WriteLine("Wait an connect Request...");
                //开始监听,这个方法会阻塞线程的执行,直到接收到一个客户端的连接请求
                Socket clientsocket = socket.Accept();

                //输出客户端地址
                Console.WriteLine("Client Address is:{0}", clientsocket.RemoteEndPoint);
                //把客户端的请求数据读入保存到一个数组中
                byte[] buffer = new byte[2048];

                int receivelength = clientsocket.Receive(buffer, 2048, SocketFlags.None);
                string requeststring = Encoding.UTF8.GetString(buffer, 0, receivelength);

                //在服务器端输出请求的消息
                Console.WriteLine(requeststring);

                //服务器端做出相应的内容
                //相应的行状态
                string statusLine = "HTTP/1.1 200 OK\r\n";
                byte[] responseStatusLineBytes = Encoding.UTF8.GetBytes(statusLine);
                string responseBody = "<html><head><title>Default Page</title></head><body><h1>Welcome you!</h1></body></html>";
                string responseHeader = string.Format("Content-Type:text/html;charset=UTF-8\r\nContent-Length:{0}\r\n", responseBody.Length);
                byte[] responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader);
                byte[] responseBodyBytes = Encoding.UTF8.GetBytes(responseBody);

                //向客户端发送行状态
                clientsocket.Send(responseStatusLineBytes);

                //向客户端发送回应头信息
                clientsocket.Send(responseHeaderBytes);

                //发送头部和内容的空行
                clientsocket.Send(new byte[] { 13, 10 });

                //向客户端发送主体部分
                clientsocket.Send(responseBodyBytes);

                //断开连接
                clientsocket.Close();
                Console.ReadKey();
                break;
            }

            //关闭服务器
            socket.Close();
        }
    }
}
2.运行Web服务器

3.浏览器访问服务器监听端口

相关标签: C# socket