欢迎光临
我们一直在努力

最简单的Web服务器

本案例中应用到得一些类和方法先一一列出来

1.IPAddress类用来表示一个IP地址

1.1 IPAddress.Parse("192.168.43.104") 将一串ip地址字符串转换为IP地址
1.2 IPAddress.Loopback  获得本机回环地址 即:127.0.0.1

2.IPEndPoint类(端点) 说白了就是ip地址和端口的组合(IP:Point) 他能唯一确定网络中的一台电脑的某一个应用程序

IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.43.104"), 8080); //创建了一个ip地址为192.168.43.104端口号位8080的网络端点

2.1.1 Address 获取或设置终结点的 IP 地址   ex:endPoint.Address  //192.168.43.104
2.1.2 AddressFamily 获得网络协议              ex:endPoint.AddressFamily  //http
2.1.3 AddressPoint   获得端口号信息          ex:endPoint.Point   //8080

3.socket    位于System.Net.Socket命名空间中    其封装了Socket(套接字)的操作。

3.1 Listen 设置基于连接通信的socket进入监听状态,并设置等待队列的长度。  ex:socket.Listen(10)  //只允许10个客户端同时发生请求
3.2 Accept 等待一个新的连接,当新的连接到达的时候,返回一个针对新连接的Socket对象。即每个建立连接的客户端都对应有一个Socket对象在服务器端,客户端通过这个对象就可以和服务端进行连接通信了。    ex:   Socket client = socket.Accept();
3.3 Receive 通过Socket接受字节数据,保存到一个字节数据中,返回一个int型的数据(实际接收的字节数)。
ex://新建一个缓冲区
                byte[] buffer = new byte[2048];
                //接受数据
                int length = client.Receive(buffer,buffer.Length,SocketFlags.None);
3.4 Send 故名思议 就是发送数据吧 没错  send通过Socket发送预先保存在字节数组中的数据。

下面是完整的事例代码:

 

//---------------------------------------------------------------------------------------- IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.43.104"), 8080); //创建socket,使用ipv4地址,传输协议为tcp,双向、可靠、基于连接的字节流 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //将其绑定到一个端点上  socket.Bind(endPoint); //设置连接队列的长度 socket.Listen(10); Console.WriteLine("开始监听,端口号:{0}",endPoint.Port); while (true) { //开始监听。这个方法阻塞线程执行,直到接受到一个客户端的连接请求 Socket client = socket.Accept(); //输出客户端地址 Console.WriteLine("客户端地址:{0}",client.RemoteEndPoint); //新建一个缓冲区 byte[] buffer = new byte[2048]; //接受数据 int length = client.Receive(buffer,buffer.Length,SocketFlags.None); //将请求的数据转换为utf-8 //Encoding utf8 = Encoding.UTF8; string requestString = Encoding.UTF8.GetString(buffer, 0, length); //显示请求的消息  Console.WriteLine(requestString); //回应的状态行 string statusLine = "HTTP/1.1 200 OK\r\n"; byte[] statusLineBytes = Encoding.UTF8.GetBytes(statusLine); //准备发送到客户端的网页 string responseBody = "<html><head><title>hello world</title></head><body><h2>Hello World</h2></body></html>"; byte[] responseBodyBytes = Encoding.UTF8.GetBytes(responseBody); //回应的头部 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); client.Send(statusLineBytes); //发送状态信息 client.Send(responseHeaderBytes); //发送回应头 client.Send(new byte[] { 13, 10 }); //头部与内容的分割行 client.Send(responseBodyBytes); //发送内容部分  client.Close(); //断开与客户端的连接 if (Console.KeyAvailable) break; //跳出死循环  } //关闭服务器 socket.Close();

 

因为http协议是无状态连接,所以每完成一次或多次请求服务器会自动与客户端断开连接,保持服务器的资源

运行结果:

 

最简单的Web服务器

最简单的Web服务器

 

本文源代码点击下载  想运行一下结果的童鞋可以参考下哈

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《最简单的Web服务器》
文章链接:https://www.456zj.com/5057.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址