zoukankan      html  css  js  c++  java
  • Socket 初识 用Socket建立一个简易Web服务器

    摘自《Asp.Net 本质论》作者:郝冠军

    //在.Net中。system.Net命名空间提供了网络编程的大多数数据据类型以及常用操作,其中常用的类型如下:
    /*
    IPAddress 类表示一个IP地址
    * IPEndPoint类用来表示一个IP地址和一个端口号的组合,成为网络的端点。
    * System.Net.Sockets命名空间中提供了基于Socked编程的数据类型。
    * Socket类封装了Socked的操作。
    * 常见的操作:
    * Listen:设置基于连接通信的Socket进入监听状态,并设置等待队列的长度。
    * Accept:等待一个新的连接,当新的连接到达的时候,返回一个针对新连接的Socket对象。通过这个新的Socket对象,可以与新连接通信。
    * Receive:通过Socked接受字节数据,保存到一个字节数组中,返回实际接受的字节数。
    * Send:通过Socked发送预先保存在字节数组中的数据。
    */

     1 class Socket_Study
     2     {
     3         public void CreateSocket()
     4         {
     5             //获得本机的loopback网络地址,即127.0.0.1
     6             IPAddress address = IPAddress.Loopback;
     7             //创建可以访问的端点,8974 为0表示一个空闲的端口号
     8             IPEndPoint endpoint = new IPEndPoint(address, 8974);
     9             Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    10             socket.Bind(endpoint);
    11             socket.Listen(10);
    12             Console.WriteLine("开始监听,端口号:{0}",endpoint.Port);
    13             while (true)
    14             {
    15                //开始监听,这个方法会阻塞线程的执行,知道接收到一个客户端的连接请求
    16                 Socket client = socket.Accept();
    17                 Console.WriteLine(client.RemoteEndPoint);
    18                 //准被读取客户端请求的数据,读取的数据放在一个数组中
    19                 byte[] buffer = new byte[4096];
    20 
    21                 int lentth = client.Receive(buffer, 4096, SocketFlags.None);
    22 
    23                 string requeststring = Encoding.UTF8.GetString(buffer, 0, lentth);
    24 
    25                 Console.WriteLine(requeststring);
    26                 //回应状态行
    27                 string statusLine = "Http/1.1 200 ok 
    ";
    28                 byte[] statusLineBytes = Encoding.UTF8.GetBytes(statusLine);
    29                 //准备发送到客户端的网页
    30                 string responseBody = "<html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title>Socket Study </title></head><body><form id="form1" runat="server"><div>Hello World ,Socket Study </div> </form></body></html>";
    31                 byte[] responseBytes = Encoding.UTF8.GetBytes(responseBody);
    32                 string responseHeader = string.Format("Content-type:text/html; charset=UTF-8 
    Content-length:{0}
    ", responseBody.Length);
    33                 byte[] responseHeaderBytes = Encoding.UTF8.GetBytes(responseHeader);
    34                 //向客户端发送状态信息
    35                 client.Send(statusLineBytes);
    36                 //发送回应头
    37                 client.Send(responseHeaderBytes);
    38                 client.Send(new byte[]{13,10});
    39                 //发送内容
    40                 client.Send(responseBytes);
    41                 client.Close();
    42                 if (Console.KeyAvailable)
    43                 {
    44                     break;
    45                 }
    46                 socket.Close();
    47             }
    48         }
    49     }
    View Code

      运行之后打开浏览器 输入地址:http://localhost:8974/

       即可看到结果。

  • 相关阅读:
    [haoi2009]逆序对数列
    [haoi2008]木棍分割
    【LibreOJ 6277】数列分块入门 1 (分块)
    【模板】 最大流模板(ISAP)
    【模板】最大流模板(dinic)
    [模板] zkw线段树
    [luogu P1962] 斐波那契数列(带快速幂矩阵乘法模板)
    [SCOI2010] 股票交易 (单调队列优化dp)
    [luogu P2285] [HNOI2004]打鼹鼠
    [poj 2152] fire (树形dp)
  • 原文地址:https://www.cnblogs.com/lengp/p/3699531.html
Copyright © 2011-2022 走看看