zoukankan      html  css  js  c++  java
  • 简易web服务器

    当通过Socket开发网络应用程序的时候,首先需要考虑所使用的网络类型,主要包括以下三个方面:

        1)Socket类型,使用网络协议的类别,如IPv4的类型为PF_INET。

        2)数据通信的类型,常见的数据报(SOCK_DGRAM)、数据流(SOCK_STREAM)。

        3)使用的网络协议,比如:TCP协议。

          在同一个网络地址上,为了区分使用相同协议的不同应用程序,可以为不同的应用程序分配一个数字编号,这个编号称为网络端口号(port)。端口号是一个两字节的证书,取值范围从0~65535。IANA(Internet Assigned Number Authority,互联网地址分配机构)维护了一个端口分配列表,这些端口分三类,第一类的范围是0~1023,称为众所周知的端口,由IANA进行控制和分配,由特定的网络程序使用,例如,TCP协议使用80号端口来完成HTTP协议的传输。第二类的范围是1024~49151,称为登记端口,这些端口不由IANA控制,但是IANA委会了一个登记的列表,如果没有在IANA登记的话,也不应该在程序中使用。但是大多数的系统中,在没有冲突的情况下,也可以有用户程序使用。第三类的范围是49152~65535,称为动态或者似有端口号,这些端口可以由普通用户程序使用。

          对于一个网络应用程序来说,通过地址、协议和端口号可以唯一地确定网络上的一个应用程序。其中地址和端口的组合称为端点(EndPoint)。每个Socket需要绑定到一个端点上与其他端点进行通信。

          在.NET中,System.Net命名空间提供了网络编程的大多数数据类型以及常用操作,其中常用的类型如下:

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

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

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

        4)Socket类封装了Socket的操作。

          常用的操作如下:

        1)Listen:设置基于连接通信的Socket进入坚挺状态,并设置等待队列的长度。

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

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

        4)Send:通过Socket发送预先保存在字节数组中得数据。

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Net;// 
    using System.Net.Sockets;// 
      
    namespace 基于Socket的最简单Web服务器 
    { 
        class Program 
        { 
            static void Main(string[] args) 
            { 
                IPAddress address = IPAddress.Loopback;//取得本机的loopback网络地址,即127.0.0.1 
                IPEndPoint endPoint = new IPEndPoint(address, 49152);//创建可访问的端点,49152表示端口号,如果设置为0,表示使用一个空闲的端口号 
                Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建socket,使用IPv4地址,数据通信类型为字节流,TCP协议 
                socket.Bind(endPoint);//将socket绑定到一个端点上 
                socket.Listen(10);//设置连接队列的长度 
                Console.WriteLine("开始监听,端口号:{0}",endPoint.Port ); 
                while (true) 
                { 
                    Socket client = socket.Accept();//开始监听,这个方法会阻塞线程的执行,直到接受到一个客户端的请求连接 
                    Console.WriteLine(client.RemoteEndPoint);//输出客户端的地址 
                    byte[] buffer = new byte[4096];//准备读取客户端请求的数据,读取的数据将保存在一个数组中 
                    int length = client.Receive(buffer, 4096, SocketFlags.None);//接受数据 
                    //将请求数据翻译为UTF-8 
                    System.Text.Encoding utf8 = System.Text.Encoding.UTF8; 
                    string requestString = utf8.GetString(buffer, 0, length); 
                    Console.WriteLine(requestString);//显示请求 
                    //回应的状态行 
                    string statusLine = "HTTP/1.1 200 OK
    "; 
                    byte[] statusLineBytes = utf8.GetBytes(statusLine); 
                    //准备发送回客户端的网页 
                    string responseBody = "<html><head><title>From Socket Server</title></head><body><h1>Hello world.<h1></body></html>"; 
                    byte[] responseBodyBytes = utf8.GetBytes(responseBody); 
                    //回应的头部 
                    string responseHeader = string.Format("Content-Type:text/html;charset=UTF-8
    Content-Length:{0}
    ",responseBody.Length ); 
                    byte[] responseHeaderBytes = 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(); 
            } 
        } 
    }
  • 相关阅读:
    移位运算符
    java 链表数据结构
    log4j.properties配置详解
    java异常面试题
    QuickHit项目(输出字符串游戏)
    适配器模式
    java 单例
    sql索引的填充因子多少最好,填充因子的作用?
    聚焦索引和非聚焦索引的区别
    二叉树。。。。
  • 原文地址:https://www.cnblogs.com/spider024/p/3147928.html
Copyright © 2011-2022 走看看