欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

最简单的Web服务器事例分析

程序员文章站 2022-06-22 13:42:44
本案例中应用到得一些类和方法先一一列出来 1.ipaddress类用来表示一个ip地址   1.1 ipaddress.parse("192.168.43.104&q...

本案例中应用到得一些类和方法先一一列出来
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服务器事例分析


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

 
摘自 wlitsoft