精华内容
下载资源
问答
  • C51 Web Server 基于uIP协议栈 使用keil环境,直接可以使用。
  • 基于HTTP协议Web服务器

    千次阅读 2016-03-22 17:05:55
    这篇博文只给出运行截图,没有附上源代码。... HTTP协议是一个属于应用层的协议,主要特点可概括如下: 1)支持客户/服务器模式。 2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法

    这篇博文只给出运行截图,没有附上源代码。
    如果想要参考源码,请到 https://github.com/common1994/httpd * 下载。*


    *下面简单讲述一下HTTP协议和项目描述:*
    HTTP协议是一个属于应用层的协议,主要特点可概括如下:
    1)支持客户/服务器模式。
    2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
    3)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
    4)无连接:无连接并不是不需要连接,无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。
    5)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。

    项目描述:
    1)HTTP协议的特点之一是支持客户/服务器模式,客户只需传送请求方法和路径给服务器;
    2)对客户端提出的请求,服务器端在确定url有效后,返回给客户端请求的资源,包括文字、图片;
    3)支持表单提交,可以借助浏览器或telnet工具使用GET、POST方法访问服务器;
    4)服务器拿到客户提交的数据后,会把数据存入到远端数据库,客户端也可请求查看数据库信息;

    下面这幅图是整个项目的框架:
    这里写图片描述

    接下来是程序运行截图: (命令行是服务器端,浏览器是客户端)

    1、服务器端起来以后,处于阻塞状态,等待客户端的连接请求:
    这里写图片描述

    2、客户端连接服务器的ip和端口号,表示请求主页(主页信息是一行文字和一幅图片)
    这里写图片描述

    3、客户端在服务器的网络地址(ip+端口号)后加上申请资源的路径,该页面能从键盘得到两个数
    这里写图片描述
    经提交(submit)后,会显示两个数相加的和
    这里写图片描述
    这里写图片描述

    4、首先看一下数据库中已有的信息:
    这里写图片描述

    5、在表单中填入要插入数据库中学生信息表的信息
    这里写图片描述
    数据插入成功:
    这里写图片描述

    6、再次确认数据库的内容:
    这里写图片描述
    (因为id项被设置为自动增长,若在地5)步中把id设为默认0,每插入一个元素,id会自动在最大的id的基础上再加一,之前有些元素已经被删除,所以插入后id变为很大的数)

    展开全文
  • 准备通过java web基于snmp协议的局域网远程电源管理系统,(学校机房有3层,1200台电脑以上)以下是我的想法,请各位指导提建议哈,在此感谢呀 1. 通过mib borwer收集第三方电源有关的mib库,保存到枚举,集合或...
  • 基于HTTP协议实现的小型web服务器

    万次阅读 多人点赞 2017-04-28 07:37:28
    1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源 2、服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面...

    我们先了解一下这个项目最终能达到的一个目标,然后以这个来进行项目的分析:
    1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源
    2、服务器将客户请求的资源以html页面的形似呈现,并能够进行差错处理(如:客户请求的资源不存在时,服务器能够返回一个404的页面)
    3、服务器能进行简单的cgi运行。比如当客户在表单中输入数据后,服务器能够将运行结果返回个客户
    4、能够通过页面对数据库进行操作,如增删查改等操作

    一、http服务器实现的基本框架

    • 关于HTTP协议
      即超文本传输协议,是互联网上应用最广泛的网络协议。它是应用层的协议,底层是基于TCP通信的。HTTP协议的工作过程:客户通过浏览器向服务器发送文档请求,浏览器将请求的资源回应给浏览器,然后关闭连接。即:连接->请求->响应->关闭连接。
    • 关于URL
      即统一资源定位符,每个网页都对应一个URL地址(俗称网址),具有全球唯一性。它包含的信息指出文件的位置以及浏览器应该怎么处理它。 一个完整的URL包括协议类型、主机类型、路径和文件名。
      http协议的URL格式: http: //host[:port][abs_path] ,http表示使用http协议来进行资源定位;host是主机域名;port是端口号,一般有默认的;abs_path代表资源的路径。
      这里我主要介绍项目中涉及的URL的两种格式—URL带参数和不带参数的。
      这里写图片描述
      GET方法使用的是带参数的URL,即传递的参数会使用?连接在资源路径后边;POST方法使用的是不带参数的URL,它的参数是通过http请求报头中的请求消息体传递给服务器的。
    • 关于HTTP的请求与响应格式
      这里写图片描述
      响应报头中的状态码和状态码描述,例如:当请求的资源不存在时,会收到“404 NotFound”的页面,404就是状态码,“NotFound”就是状态码描述,即请求的文件不存在。

    二、服务器实现的基本思路

    1、http协议是基于TCP通信的协议,因此,实现web服务器的第一步至少要能实现两个主机不同进程之间的TCP通信。
    2、接下来的部分就是比较主要的处理逻辑了,当服务器收到请求后,首先应该分析请求方法(因为web服务器是要支持cgi的,但请求方法不同处理cgi也不同,这里我们只处理GET和POST方法)。
    3、当方法确定后,应该拿到请求的URL,这一步是为了我们后边能处理GET和POST方法的cgi(GET和POST的参数位置不同,GET的参数在URL中,POST的参数在请求正文中)
    4、判断资源是否存在,如果存在,判断这个资源是一个目录、普通文件还是一个可执行程序。之前几步我们已经提取到URL以及参数。GET方法:如果没有参数,就直接将请求的资源返回(即进入非cgi模式运行);否则,进入cgi模式内部运行;只要是POST方法就需要支持cgi:直接进入cgi函数内部运行。

    非cgi模式:
    进入非cgi模式时一定是GET方法且没有参数,此时进入echo_www()函数内部即可,该函数会将所请求的资源以html的格式返回给浏览器。

    cgi模式:
    这里写图片描述
    上述这张图描述了运行cgi时的过程,首先服务器要从浏览器上读取参数,然后需要fork出一个子进程进行cgi部分的处理,父进程通过环境变量的方式将参数转交给子进程,子进程运行完成后,将结果交给父进程,父进程再将数据输出给浏览器。在这个过程中可以将父进程看作一个所谓的中间量,只进行了参数的转交,因此可以将子进程的输入输出文件描述符进行重定向,即子进程直接与浏览器“联系”。

    下面总结出父子进程内部各自需要干的事情:
    这里写图片描述

    三、错误处理

    错误处理这部分的实现可以参考echo_www()函数,但需要改变响应的消息报头的格式,即改变状态码,状态码描述,以及返回的页面。例如当请求的资源不存在时,服务器需要返回给浏览器一个默认的404页面,告诉客户请求的资源不存在。效果如图:
    这里写图片描述

    四、项目文件

    这里写图片描述
    目录:
    cgi:运行cgi部分的实现代码
    conf:配置文件,存放需要绑定的服务器的ip和port
    log:shell的日志文件以及http错误处理的日志文件
    lib:mysql需要的lib库
    sql_client:mysql部分的API及CGI实现
    wwwroot:web服务器工作的根目录,包含各种资源页面(例如默认的index.html页面,差错处理的404页面),以及执行cgi的可执行程序

    文件:
    configure.sh:sheel脚本,运行该shell脚本后需要自动生成Makefile文件
    http_ctl.sh:服务器控制脚本,需要实现服务器的启动、暂停以及重新启动
    httpd.pid:与http_ctl.sh配合使用。如果把服务器变成守护进程在后台运行,重新启动时就需要检测服务器是否启动,该文件存放服务器启动以后的进程id
    httpd.h:服务器的方法声明
    httpd.c:方法实现
    main.c:服务器的主逻辑

    五、实现结果

    请求资源存在:
    这里写图片描述

    运行cgi后:
    这里写图片描述

    六、源码:

    https://github.com/lybb/Linux/tree/master/httpd

    附:
    这里是我遇到的一些问题,粘出来,也可能是你遇到的问题:
    1、本地环回测试ok,Linux下的浏览器测试也可以,但不能接外部的浏览器访问(没有设置桥接模式)嗯~要是在外部浏览器测试的话千万别忘记关闭防火墙
    2、服务器应答时,没有将html格式的页面发送,而是将底层的实现代码展示在浏览器,并且在调试时将本来要打印的调试信息会打印到网页上(在回应空行时将send期望发送的数值写的太大,本来只需要发送两个字节的内容)
    解决:先检查代码,思路正确,在容易出现问题的地方加入调试信息,最后将问题定位在echo_www()函数内
    3、不能显示图片(这个问题是没有将所有发送的情况考虑完全,只考虑到目录、可执行程序,但没有考虑到如果请求的是一个路径明确的普通文件)
    解决:测试请求一个路径明确的test.html文件,加入调试信息 ,将问题定位在:如果请求的资源存在,应该如何处理。对于普通文件,找到后并回显给浏览器;如果是目录,应答的是默认页面;如果是可执行程序,执行后返回结果
    4、能显示图片后,但显示的不完整(原因:echo_www中,期望读取一行信息的line值太小,不能存下一张图片)
    5、运行cgi模式时,每次提交数据并进行submit后都会自动出现提醒下载的页面
    原因:在响应报头中,将Content-Type中的”text”写成”test”。而浏览器对于不能识别或解析的实体,都会提醒用户下载。

    展开全文
  • 网络上很多基于ksoap2开发包的WEB SERVICE调用,虽然ksoap2不大,...本代码可以基于http协议,拼凑SOAP协议,完成.net以及java开发的web service调用。供大家分享!内部也有一例是基于ksoap2开发包的web service调用
  • 简单介绍基于WEB开发的HTTP协议

    千次阅读 2007-05-18 11:37:00
    简单介绍基于WEB开发的HTTP协议 今天搜索socket时找到一篇文章 基于Java的web服务器工作原理>,却在里面看到了部分介绍HTTP协议的,虽然简单,但是读完之后,还是对HTTP有一点新的理解,所以摘录了一下(部分内容经过...

             简单介绍基于WEB开发的HTTP协议

            今天搜索socket时找到一篇文章 <基于Java的web服务器工作原理>,却在里面看到了部分介绍HTTP协议的,虽然简单,但是读完之后,还是对HTTP有一点新的理解,所以摘录了一下(部分内容经过笔者更改).

      HTTP(The Hypertext Transfer Protocol) 是一种让 Web 服务器与浏览器(客户端)通过 Internet 发送与接收数据的协议。它是一个请求、响应协议.客户端发出一个请求,服务器响应这个请求。HTTP 运用可靠的 TCP 连接,通常用的 TCP 80 端口。它的第一个版本是 HTTP/0.9 ,然后被 HTTP/1.0 取代。当前的版本是 HTTP/1.1 ,由RFC2616(.pdf) 定义。

      本节主要对应 HTTP 1.1 ,足够使你充分理解由 Web 服务器程序发出的消息。如果你对更加详细的知识有兴趣,可以参考 RFC2616 。

      在 HTTP 中,客户端总是通过建立一个连接,并发送一个 HTTP 请求来发起一个事务。服务器不能主动去与客户端联系,也不能给客户端发出一个回叫连接。客户端与服务器端都可以提前中断一个连接。例如,当用一个浏览器下载一个文件时,你可以通过点击“停止”键来中断文件的下载,关闭与服务器的 HTTP 连接。

      HTTP 请求

      一个 HTTP 请求包含三个部分:

      Method-URI-Protocol/Version方法-地址-版本

      Request header请求头

      Entity body请求实体

      下面是一个 HTTP 请求实例

      POST /servlet/default.jsp HTTP/1.1

      Accept: text/plain; text/html 

      Accept-Language: en-gb 

      Connection: Keep-Alive 

      Host: localhost 

      Referer: http://localhost/ch8/SendDetails.htm 

      User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98) 

      Content-Length: 33 

      Content-Type: application/x-www-form-urlencoded 

      Accept-Encoding: gzip, deflate 

      LastName=Franks
    &FirstName =Michael

    The Method-URI-Protocol/Version 在这个请求的第一行:

    POST  / servlet / default .jsp HTTP / 1.1

     

            其中 POST 是请求的类型。每个客户端 HTTP 请求可以是 HTTP 规范中指定的许多请求类型中的一种。HTTP 1.1 支持七种类型的请求,它们是 GET,POST,HEAD,OPTIONS,PUT,DELETE,TRACE。其中 GET 与 POST 是 Internet 应用中经常用到的二种请求类型。

      URI 完整地指定了 Internet 资源。一个 URI 通常被解析为相对服务器的根目录。这样,它应该总是以一个 '/' 前缀开始。一个 URL 实际上是 URI 的一种类型。

      Version 指的是该 HTTP 请求所用到的 HTTP 协议版本。

      请求头包含了客户端环境与请求实体的一些有用的信息。例如它包含浏览器设定的语言、实体的长度等等。每条请求头用回车换行符(CRLF)分开。

      一个非常重要的空行分开了请求头与实体,它标志着实体内容的开始。一些 Internet 开发书籍认为这个 CRLF 空行是 HTTP 请求的第四个部分。

      在上面的 HTTP 请求中,实体只是简单以下的一行:

              LastName=Franks&FirstName=Michael

      在一个典型的 HTTP 请求中,请求实体内容会长得多。

      HTTP 响应

      与请求相似,HTTP 响应也由三部分组成:

      Protocol-Status code-Description协议状态 描述代码

      Response headers响应头

      Entity body响应实体

      以下是一个 HTTP 响应的实例:

      HTTP/1.1 200 OK

      Server: Microsoft-IIS/4.0

      Date: Mon, 3 Jan 1998 13:13:33 GMT

      Content-Type: text/html

      Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT

      Content-Length: 112

      
    < html >

      
    < head >

      
    < title > HTTP Response Example </ title ></ head >< body >

      Welcome to Brainy Software

      
    </ body >

      
    </ html >

            响应头的第一行类似请求头的第一行,告诉你所用的协议是 HTTP 1.1 ,请求成功(200=success),以及没有任何问题。

      响应头类似请求头也包含了一些有用的信息。响应的实体响应本身的 HTML 内容。头与实体之间由回车换行的空行(CRLF)分开。

    展开全文
  • 在开发网站的过程中,首先我们需要配置一个web服务器,一般会使用Apache这个开源的服务器软件,扩展性高,支持性也很好。...但是现在,我们经过分析HTTP协议,我们会自己实现一个Web服务器,当然了,只是一个很小的We

    在开发网站的过程中,首先我们需要配置一个web服务器,一般会使用Apache这个开源的服务器软件,扩展性高,支持性也很好。实际上如果是windows系统的话那么也可以使用windows操作系统提供的IIS(Internet Information Server)。这两个服务器软件使用度各占60%和30%。但是现在,我们经过分析HTTP协议,我们会自己实现一个Web服务器,当然了,只是一个很小的Web服务器了。

    那么用什么来实现Web服务器呢?实际上实现一个Web服务器主要就是实现HTTP协议,而这个HTTP协议处于计算机网络结构体系中的应用层,那么我们就可以借助应用程序接口Socket来实现HTTP协议。在这之前我们需要通过抓包来分析一下HTTP协议的机制,抓包在这里就不说了,会用另一篇博客来详细分析利用抓包来分析HTTP协议的详细过程,网上也有很多的资料,大家可以参考一下。

    那么下面哦我们就来看看这个web服务器是如何实现的。

    helpFunction.h文件(函数声明)

    
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <winsock2.h>
    #pragma comment ( lib , "ws2_32" )
    
    #define MAXLINE 10000
    
    
    // 声明函数
    
    // 获取文件类型
    void GetFileType( char * filename , char * fileType ) ;
    
    // 处理静态请求
    void HandleStatic( SOCKET clientSocket , char * filename ) ;
    
    // 处理动态请求的函数
    void HandleDynamicFunc( char * filename , char * args , int & result ) ;
    
    // 处理动态请求
    void HandleDynamic( SOCKET clientSocket , char *filename , char * args ) ;
    
    //解析URI
    bool ParseURI( SOCKET clientSocket , char * uri , char * filename , char *args ) ;
    
    // 解析请求(Parse Request ),如果为静态返回true,如果为动态,返回false
    void ParseRequest( SOCKET clientSocket , char * request ) ;
    
    // 处理请求行:读取请客户端的请求,给出响应
    void HandleRequestLine( SOCKET clientSocket , char * request ) ;
    
    
    
    
    
    
    
    

    helpFunction.cpp(主要功能函数定义)

    #include "helpFunction.h"
    
    
    // 获取文件类型
    void GetFileType( char * filename , char * fileType )
    {
    	memset( fileType , 0 , 20 ) ;
    	if( strstr( filename , ".html") || 0 == strcmp( filename , "/" ) )
    	{
    		strcpy( fileType , "text/html" ) ;
    	}
    	else if( strstr( filename , ".gif" ) )
    	{
    		strcpy( fileType , "image/gif" ) ;
    	}
    	else if( strstr( filename , ".jpg" ) )
    	{
    		strcpy( fileType , "imgae/jpeg" ) ;
    	}
    	else
    	{
    	    strcpy( fileType , "text/plain" ) ;
    	}
    }
    
    // 处理静态请求
    void HandleStatic( SOCKET clientSocket , char * filename )
    {
    	// 直接返回服务器主页
    	if( 0 == strcmp( filename , "/" ) )
    	{
    		strcpy( filename , "/index.html" ) ;
    
    	}
    
    	FILE *fp = fopen( filename , "r" ) ;
    	if( fp == 0 )
    	{
    		// 如果找不到响应的数据就返回404状态码,并将其发送给客户端
    		char response[] = "HTTP/1.1 404 NOT FOUND\r\n\r\n";
    		send( clientSocket, response, strlen( response ), 0 );
    	}
    	else
    	{
    		// 在文件目录中找响应的资源
    		int file_size ;
    		char *content;
    		char response[1024];
    		fseek( fp, 0, SEEK_END );
    		file_size = ftell( fp );
    		fseek( fp, 0, SEEK_SET );
    		content = (char*)malloc( file_size + 1 );
    		fread( content, file_size, 1, fp );
    		content[file_size] = 0;
    
    		// 检测请求文件的类型
    		char fileType[20] ;
    		GetFileType( filename , fileType ) ;
    
    		// 发送请求headers到客户端
    		sprintf( response, "HTTP/1.1 200 OK\r\n") ;
    		sprintf( response , "%sContent-Type: %s\r\n" , response , fileType ) ;
    		sprintf( response , "%sContent-Length: %d\r\n", response , file_size ) ;
    		sprintf( response , "%sServer: Bobo Server\r\n\r\n" , response ) ;
    		send( clientSocket , response, strlen( response ), 0 ) ;
    
    		// 发送请求body到客户端
    		sprintf( response , "%s" , content ) ;
    		send( clientSocket , response , strlen( response ) , NULL ) ;
    
    		free( content ) ;
    	}
    }
    
    // 处理动态请求的函数
    void HandleDynamicFunc( char * filename , char * args , int & result ) 
    {
    	// 处理动态请求参数
    	char * a = strtok( args , "&" ) ;
    	char * b = strtok( NULL , "&" ) ;
    	int x = atoi( a ) ;
    	int y = atoi( b ) ;
    
    	if( strstr( filename , "Add" ) )
    	{
    		result = x + y ;
    	}
    	else if( strstr( filename , "Sub" ) )
    	{
    		result = x - y ;
    	}
    }
    
    // 处理动态请求
    void HandleDynamic( SOCKET clientSocket , char *filename , char * args ) 
    {
    	int result = 0 ;
    	char response[8000] ;  // 响应内容
    	// 执行动态请求
    	HandleDynamicFunc( filename , args , result ) ;
    
    	// 发送响应头到客户端
    	sprintf( response, "HTTP/1.1 200 OK\r\n") ;
    	sprintf( response , "%sServer: Bobo Server\r\n\r\n" , response ) ;
    	send( clientSocket , response , strlen( response ) , NULL ) ; 
    
    	 //发送响应Body到客户端
    	sprintf(response , "<head><head><title>Welcome to Bobo Server!</title></head>" ) ;
    	sprintf( response , "%s<body>The result is %d</body>" , response , result ) ;
    	send( clientSocket , response , strlen( response ) , NULL ) ; 
    }
    
    
    //解析URI
    bool ParseURI( SOCKET clientSocket , char * uri , char * filename , char *args )
    {
    	sprintf( filename , ".%s" , uri ) ;
    	if( !strstr( uri , "dynamic"  ) )  // 静态请求
    	{
    		strcpy( args , "" ) ;
    		strcpy( filename , "." ) ;
    		strcat( filename , uri ) ;
    		if( uri[strlen( uri ) - 1 ] == '/' )
    		{
    			strcat( filename , "index.html" ) ;
    		}
    		return true ;
    	}
    	else  // 动态请求
    	{
    		char * ptr = strstr( uri , "?" ) ;
    		if( ptr )
    		{
    			strcpy( args , ptr + 1 ) ;
    		}
    		else
    		{
    			strcpy( args , "" ) ;
    		}
    		ptr = strstr( uri , "?" ) ;
    		*ptr = '\0' ;
    
    		strcpy( filename , uri ) ;
    		strcat( uri , "?" ) ;
    		strcat( uri , args ) ;
    		return false ;
    	}
    }
    
    // 解析请求(Parse Request ),如果为静态返回true,如果为动态,返回false
    void ParseRequest( SOCKET clientSocket , char * request )
    {
    	// 判断URI请求的是否为静态请求
    	bool is_static ;
    
    	//  获取请求的命令类型
    	char *method = strtok( request, " " ) ;
    	//获取请求的uri
    	char *uri = strtok( 0 , " " ) ;
    
    	// 解析URI
    	char args[20] = { 0 } ;    // URI中的动态请求参数
    	char filename[100] = { 0 } ;  // URI中静态请求中的文件名
    
    	is_static = ParseURI( clientSocket , uri , filename , args ) ;
    	
    	if( is_static )  // 请求为静态
    	{
    		HandleStatic( clientSocket , filename ) ;
    	}
    	else  // 请求为动态
    	{
    		HandleDynamic( clientSocket , filename , args ) ;
    	}
    }
    
    
    // 处理请求行:读取请客户端的请求,给出响应
    void HandleRequestLine( SOCKET clientSocket , char * request )
    {
    	// 解析URI
    	ParseRequest( clientSocket , request ) ;
    }

    WebServer.cpp(主函数)

    //
    //
    //      创建一个很小的WebServer,基于HTTPS协议
    //
    /
    //
    
    #include "helpFunction.h"
    
    
    // 主函数
    int main()
    {
    	// 初始化windows socket
    	WSADATA wd ;
    	SOCKET s ;
    	if( WSAStartup( MAKEWORD( 2, 2 ), &wd ) < 0 )
    	{
    		fprintf( stderr, "winsock startup failed\n" ) ;
    		exit( -1 );
    	}
    
    	// 创建服务器套接字
    	s = socket( AF_INET, SOCK_STREAM, 0 ) ;
    
    	// 绑定并监听
    	SOCKADDR_IN addr;
    	memset( &addr, 0, sizeof( addr ) );
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons( 827 );
    	addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    	int ret = bind( s, (struct sockaddr*)&addr, sizeof( addr ) );
    	if( ret < 0 )
    	{
    		fprintf( stderr, "bind failed\n" );
    		closesocket( s );
    		exit( -1 );
    	}
    
    	// 进行监听
    	ret = listen( s, 1024 ) ;
    	if( ret < 0 )
    	{
    		fprintf( stderr, "listen failed\n" );
    		closesocket( s );
    		exit( -1 );
    	}	
    
    	char request[8000] = { 0 } ;  // 请求
    	while( true )
    	{
    		// 连接到客户端的套接字
    		SOCKET clientSocket = accept( s, 0, 0 );
    
    		// 接受客户端的信息
    		recv( clientSocket, request, sizeof( request ), 0 );
    
    		// 将客户端的信息输出到终端
    		printf( request ) ;
    
    		// 处理请求,主要功能函数
    		HandleRequestLine( clientSocket , request ) ;
    	}
    
    	return 0 ;
    }
    

    应为代码中注释比较清楚,在这里就只说一下重点部分。

    实现这个Web服务器的主要就是用到了socket来发送ASCII格式的文本命令,客户端(也包含)浏览器和这个Web服务器之间分别解释命令给出响应即可。

    我目前实现的这个Web服务器是仿造《深入理解计算机操作系统》中的一段Linux程序写的Windows程序,实现了一个Web服务器主要的框架,虽然没有考虑到安全和容错问题,但是大部分服务器都是这样一个基于套接字实现的框架。

    在这个程序

    在这个程序中主要实现了页面访问和加减法操作。熟悉了URI中的基本格式,在这个程序中,进行加法的操作是这样的请求URI127.0.0.1:827/dynamic/Add?3&4,服务器收到这个请求会在后台进行3+4的操作,最后把结果返回给客户端。

    顾名思义,URI127.0.0.1:827/dynamic/Sub?3&4进行减法操作。

    访问127.0.0.1:827会直接返回服务器首页,即文件index.html。



    在上图中,输入的URI中包含了dynamic这个关键字,实际上,这个dynamic本该是一个文件夹的名字,它代表的含义是处理动态请求的区域,一般含有这个dynamic的URI都会进入这个区域找出在这个路径下的处理函数,例如这里的处理函数就是Add,进行加法的一个程序。在我们实现的这个Web服务器中为了简便并没有实现这样的路径查找,只是简单模拟了其逻辑,在后面的优化中会慢慢实现。


    要注意的是,浏览器作为客户端访问的时候,服务器发给客户端的响应必须是html格式的文本,而不能是普通的文字信息,必须加上html标签。


    实际上,只要多动一下手就可以看到自己想看的结果,那是令人兴奋的!





    展开全文
  • 前言:之前对于RPC方面的学习多限于对RMI原理的学习,直到今天在看陈康贤前辈的《大型分布式网站架构-设计与实践》这本书的时候,才发现原来RPC可以基于TCP协议也可以基于HTTP协议(这里所说的TCP协议与HTTP协议更多...
  • 基于 Socket 和 HTTP协议实现简单的Web服务器

    万次阅读 多人点赞 2018-07-21 16:40:30
    Web服务器能够实现的基本功能: 1、实现最基本的HTTP/1.0版本的web服务器,客户端能够使用GET、POST方法请求资源  2、服务器将客户请求的资源以html页面的形式呈现,能够返回一个静态页面,并能够进行差错处理...
  • 利用Socket API实现基于TCP协议的RPC调用,由服务的调用方与服务的提供方建立Socket连接,并由服务的调用方通过Socket将需要调用的接口名称、方法名称和参数序列化后传递给服务的提供方,服务的提供方反序列化后再...
  • 基于TCP的协议基于UDP的协议

    万次阅读 2015-04-11 13:32:14
    TCP与UDP区别 TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。...UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不
  • Java Web之HTTP协议总结

    千次阅读 2016-06-12 23:33:08
    HTTP协议总结HTTP协议(超文本传输协议)http 是一个基于请求与响应模式的,无状态的,应用层的协议,该协议基于TCP链接(三次握手),HTTP 1.1版本中给出一种持续链接的机制,绝大多数的Web开发都是构建在HTTP协议...
  • http协议基于http协议的文件下载

    千次阅读 2019-10-11 12:27:41
    5. 基于HTTP协议的文件下载 5.1 文件整体下载 5.2 文件分段(Range)下载 5.2.1 获取文件的大小 5.2.2 下载分段文件 5.3 文件分块(chunk)下载 1. HTTP 协议概述 日常我们使用网络用得最多的无疑是在Web ...
  • Http协议基础 Web技术发展...属于一种应用程序基于数据库每个人看到的内容不同根据用户输入,返回不同结果 WEB攻击类型有数百种 WEB攻击面 1、Network 2、
  • 基于ONVIF协议的摄像头开发总结

    万次阅读 2019-04-28 20:24:57
    最近在做onvif协议的相关工作,看到一篇介绍onvif协议很好的文章,遂转载过来,以作记录 在查阅资料的时候,又找到某个博主总结的onvif专栏,...1 什么是ONVIF协议 2008年5月,由安讯士(AXIS)联合博世(BOSCH)...
  • 什么是HTTP协议? 客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守
  • 【Java Web】: HTTP协议详解

    千次阅读 2013-10-24 23:29:47
    web 开发与 Android 开发过程,...绝大多数的Web开发,都是构建在Http协议之上的Web应用,理解和掌握Http协议,将有助于我们更好地学习和掌握Servlet和JSP技术,以及其他相关的Web开发技术    持续更新中......
  • Telnet协议:  Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器...
  • 基于XMPP协议、HTML5的WebRTC

    热门讨论 2014-06-16 14:45:15
    基于XMPP协议的WebRTC,应用与Web端HTML5的一个demo,仅供大家参考;大家一起学习。
  • 基于linux通过c实现web服务器,适合新手 学习了知识点,然后通过项目巩固一下知识点,也可以了解http协议
  • Web世界通信协议 - 学习/实践

    千次阅读 2019-12-18 11:04:23
    另外发现, 网上很多博客, 问答等都没有回答清楚web中的一些协议, 通信的准确定义以及原理和实质. 这里希望自己能逐步准确整理出来网络相关的概念,协议, 原理, 本质等. 再次发现, 弄清楚一个技术本质...
  • 基于http协议的网络文件下载原理

    千次阅读 2014-02-11 11:26:31
    基于HTTP的协议的网络文件下载,工作原理建立在请求/响应模式(Request/Response)上:一个客户端与服务器建立连接后,客户端向Web服务器发出一个HTTP请求行;Web服务器在收到有效的请求后,返回一个状态行或多个响应...
  • 一. QUIC 的基本特点基于UDP的多路传输(单连接下); 极低的等待时延(相比于TCP的三次握手);... 为什么不用TCPTCP由于基于操作系统内核实现,发展速度极慢,现有的TCP Fast Open实现等等虽然早已存
  • 1-什么是HTTP 协议 即超文本传输协议,网站是基于HTTP协议的,例如网站的图片、CSS、JS等都是基于HTTP协议进行传输的。 HTTP协议是由从客户机到服务器的请求(Request)和从服务器到客户机的响应(Response)进行了...
  • 什么是web开发?

    千次阅读 2020-05-08 22:03:18
    基于web和http的程序开发; b/s和c/s结构的区别 1、都是基于http协议的程序开发; 2、b/s就是web开发; 3、c/s就是客户端开发; 4、b/s:主要是由浏览器和服务器构成; 5、c/s:主要是由客户端和服务器构成; 6、都...
  • 基于Http协议的Java隧道通讯

    千次阅读 2007-01-20 19:14:00
    SWT 客户端与服务器端传输对象时,可以通过基于Http协议的Java隧道通讯进行数据传输,下面一篇关于Http协议的Java隧道通讯的文章,收录如下: 基于Java平台的企业应用可以通过Java隧道技术实现应用在因特网上部署。...
  • 基于REST的Web服务

    千次阅读 2014-12-24 11:26:50
    代表性状态传输(Representational State Transfer,REST)在Web领域已经得到了广泛的接受,是基于SOAP和Web服务描述语言(Web Services Description Language,WSDL)的Web服务的更为简单的替代方法。接口设计方面...
  • 基于WS协议的webSocket通信

    千次阅读 2018-05-31 14:04:10
    使用的是java-webSocket github地址: ... 客户端 ...private final ExecutorService executorService = Executors.newSingleThreadExecutor();... webSocketClient = new WebSocket...webserver: 简单粗暴!
  • web开发常用的协议 :TCP UDP 和HTTP

    千次阅读 2018-05-15 10:00:00
    网络层:IP协议,ICMP协议,ARP协议,RARP协议和BOOTP协议; 传输层:TCP协议和UDP协议; 应用层:FTP,HTTP,TELNET,SMTP,DNS等协议; HTTP本身就是一个是协议,是从网络服务器传输超文本到本地浏览器的传送协议...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 373,660
精华内容 149,464
关键字:

web是基于什么协议