首页 > 代码库 > Socket 初识 用Socket建立一个简易Web服务器

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 \r\n";
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 \r\nContent-length:{0}\r\n", 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/

   即可看到结果。