写在前面

新的一年了,新的开始,打算重新看一遍asp.net本质论这本书,再重新认识一下,查漏补缺,认认真真的过一遍。

一个简单的web服务器

首先需要引入命名空间: System.Net,关于网络编程的大部分类型及操作都可以在这个命名空间下找到。

IPAddress:类用来表示一个ip地址。

IPEndPoint:用来表示一个IP地址和一个端口号的组合,称为网络的端点。

System.Net.Sockets:命名空间中提供了基于Socket编程的数据类型。

Socket类封装了Socket的操作。

常见操作:

Listen:设置基于连接通信的socket进入监听状态,并设置等待队列的长度。

Accept:等待一个新的连接,当新连接到达的时候,返回一个针对新连接的Socket对象。通过这个新的socket对象,可以与新的连接通信。

Receive:通过Socket接收字节数据,保存到一个字节数组中,返回实际接收的字节数。

Send:通过socket发送预先保存在字节数组中的数据。

通过socket创建一个简单的web服务器,通过端口8888访问该服务器,向浏览器返回一个静态页面。这个示例,通过浏览器发送请求,并由服务器生成消息响应给浏览器。

web服务器

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace WebServer
{
class Program
{
static void Main(string[] args)
{
//取得本机的loopback网络地址,即127.0.0.1
IPAddress ip = IPAddress.Loopback;
//创建可以访问的端点,8888表示一个端口号,如果设置为0,表示一个空闲的端口号
IPEndPoint endPoint = new IPEndPoint(ip, );
//创建socket,使用ipv4地址,传输控制协议tcp,双向可靠基于连接的字节流
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//将socket绑定到一个端点上
socket.Bind(endPoint);
//设置连接队列的长度
socket.Listen();
Console.WriteLine(" 开始监听,端口号:{0}", endPoint.Port);
while (true)
{
//开始监听,这个方法会阻塞线程的执行,直到收到一个客户端的连接请求
Socket client = socket.Accept();
//输出客户端的地址
Console.WriteLine(client.RemoteEndPoint);
//准备读取客户端请求的数据,去读的数据将保存在一个数组中
byte[] buffer = new byte[];
//接收数据
int length = client.Receive(buffer, buffer.Length, SocketFlags.None);
//将请求的数据翻译为utf8
System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
string requestString = utf8.GetString(buffer, , 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);
//向客户端发送状态消息
client.Send(statusLineBuffer);
//向客户端发送回应头
client.Send(responseHeaderBuffer);
//头部与内容的分割行
client.Send(new byte[] { , });
//向客户端发送内容部分
client.Send(responseBodyBuffer);
//断开与客户端的连接
client.Close();
//关闭服务器
socket.Close();
break;
}
Console.Read();
}
}
}

启动服务器,并在浏览器中输入http://localhost:8888/

服务端收到的请求内容

总结

通过搭建这个简单的web服务器,了解你在浏览器输入地址,然后回车,服务端是如何处理的以及如何响应的。

最新文章

  1. C# 将短时间格式变长正常时间格式
  2. 为Xcode添加和备份快捷代码
  3. HDU 4632 Palindrome subsequence(DP)
  4. 程序中double类型的数输出为什么要用lf
  5. Salted Password Hashing
  6. Java程序员要注意的10个问题————————好东西就是要拿来分享
  7. ExtJS4.x 开发环境搭建
  8. ***RESTful API 设计指南(阮一峰)
  9. Ubuntu 14.04数据库服务器--mysql的安装和配置
  10. codeforces Mafia
  11. Reactor Cooling
  12. [转载]typedef常见用法
  13. entityframework分布式事务中遇到的 “与基础事务管理器的通信失败”的解决方法
  14. Yii 引入 js和css
  15. A Game of Thrones(9) - Tyrion
  16. Python中super的用法
  17. 开涛spring3(4.4) - 资源 之 4.4 Resource通配符路径
  18. (94)Wangdao.com_第二十七天_键盘事件
  19. MQTT研究之EMQ:【JAVA代码构建X509证书【续集】】
  20. 自动的输入号码的辅助软件在ie浏览器下的尝试

热门文章

  1. Linux下如何查看tomcat是否启动
  2. GDB深入研究
  3. python的闭包与装饰器
  4. Mininet的安装与卸载
  5. HTML5 中canvas支持触摸屏的签名面板
  6. No plugin found for prefix &#39;jetty&#39; in the current project and in the plugin groups 【转】
  7. iOS - 视频循环播放
  8. linux 查看服务器性能常用命令
  9. solr导入mysql数据库
  10. 改Bug