摘自《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 }
运行之后打开浏览器 输入地址:http://localhost:8974/
即可看到结果。