WebService的简单实现

一、socket主机创建和使用过程

1、socket()//创建套接字

2、Setsockopt()//将套接字属性设置为允许和特定地点绑定

3、Bind()//将套接字绑定特定地址端口

4、Listen()//打开监听端口属性

以下重复进行

5、Accept()//接收客户端的连接请求

6、Read()//从客户端读数据

7、Write()//将处理好的结果发送给客户端

二、HTTP传输协议

基于socket的TCP通信,按HTTP传输协议格式化传输内容。

示例:

1、客户端发送HTTP请求

GET /txt?hal=1000 HTTP/1.1

Host: localhost:1024

User-Agent: Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/4.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: zh-cn,zh;q=0.5

Accept-Encoding: gzip, deflate

Accept-Charset: GB2312,utf-8;q=0.7,*;q=0.7

Keep-Alive: 115

Connection: keep-alive

GET:发送HTTP请求的方法,还可以是SET或者POST

/txt?hal=1000是请求根目录下的txt文件内容并传入参数hal=1000

HTTP/1.1 表示HTTP版本是1.1

2、服务端传回HTTP响应

HTTP/1.0 200 OK

Server: Reage Web Server

Content-Type: text/html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<!-- Copyright (c) 2000-2008 Quadralay Corporation.  All rights reserved. -->

<head>

<title>WebWorks Help 5.0</title>

</head>

<body>wuff</body>

</html>

前面四行(包括空行)是消息体,后面是消息。一般要指明消息体的长度,方便客户端的接收处理。

三、示例程序

======================================================================

/*

*主要实现功能,处理浏览器的get请求信息,发送网页文件。处理404、403等错误。

*1.实现绑定本机机器的1024端口作为ReageWeb服务提供网页服务的端口。(避免与机器上装有web服务器产生端口冲突)

*2.实现get获取网页方式。

*3.实现index.html作为网站的首页面

* 作者:Reage

* blog:http://blog.csdn.net/rentiansheng

*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <sys/socket.h>

#include <sys/un.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <fcntl.h>

#include <string.h>

#include <sys/stat.h>

#include <signal.h>

#define MAX 1024

int res_socket;

void app_exit();

/*

@description:开始服务端监听

@parameter

ip:web服务器的地址

port:web服务器的端口

@result:成功返回创建socket套接字标识,错误返回-1

*/

int socket_listen( char *ip, unsigned short int port){

int res_socket; //返回值

int res, on;

struct sockaddr_in address;

struct in_addr in_ip;

res = res_socket = socket(AF_INET, SOCK_STREAM, 0);

setsockopt(res_socket, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

memset(&address, 0, sizeof(address));

address.sin_family = AF_INET ;

address.sin_port =htons(port);

address.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr("127.0.0.1");

res = bind( res_socket, (struct sockaddr *) &address, sizeof( address ) );

if(res) { printf( "port is used , not to repeat bind\n" ); exit(101); };

res = listen(res_socket,5);

if(res) { printf( "listen port is error ;\n" ); exit( 102 );  };

return res_socket ;

}

/*

@description:向客户端发送网页头文件的信息

@parameter

conn_socket:套接字描述符。

status:http协议的返回状态码。

@s_status:http协议的状态码的含义

@filetype:向客户端发送的文件类型

*/

void send_http_head(int conn_socket, int status, char *s_status, char *filetype){

char buf[MAX];

memset(buf, 0, MAX);

sprintf(buf, "HTTP/1.0 %d %s\r\n", status, s_status);

sprintf(buf, "%sServer: Reage Web Server\r\n", buf);

sprintf(buf, "%sContent-Type: %s\r\n\r\n", buf, filetype);

write(conn_socket, buf, strlen(buf));

}

/*

@description:向客户端发送错误页面信息

@parameter

conn_socket:套接字描述符。

status:http协议的返回状态码。

@s_status:http协议的状态码的含义

@filetype:向客户端发送的文件类型

@msg:错误页面信息内容

*/

void send_page_error(int conn_socket, int status, char *s_status, char *msg){

char buf[MAX] ;

sprintf(buf, "<html><head></head><body><h1> %s </h1><hr>Reage Web Server 0.01</body></head>", msg);

send_http_head(conn_socket, status, s_status, "text/html");

write(conn_socket, buf, strlen(buf));

}

/*

@description:向客户端发送文件

@parameter

conn_socket:套接字描述符。

@file:要发送文件路径

*/

int send_html(int conn_socket, char *file){

int f;

char buf[MAX];

int tmp;

struct stat file_s;

//如果file为空,表示发送默认主页。主页暂时固定

if(0 == strlen(file)){

strcpy(file, "index.html");

}

//如果获取文件状态失败,表示文件不存的,发送404页面,暂时404页面内容固定。

if(stat(file, &file_s) ){

send_page_error(conn_socket, 404, "Not found", "Not found<br/> Reage does not implement this mothod\n");

return 0;

}

//如果不是文件或者无读权限,发送无法读取文件

if( !(S_ISREG(file_s.st_mode)) || !(S_IRUSR & file_s.st_mode) ){

send_page_error(conn_socket, 403 , "Forbidden", "Forbidden<br/> Reage couldn't read the file\n");

return 0;

}

//发送头文件,现在只提供html页面

send_http_head(conn_socket, 200, "OK", "text/html" );

f = open(file, O_RDONLY);

if(0 > f){

//打开文件失败,发送404页面,其实感觉发送5xx也可以的,服务器内部错误

send_page_error(conn_socket, 404, "Not found", "Not found<br/> Reage couldn't read the file\n");

return 0;

}

buf[MAX-1] = 0;//将文件内容缓冲区最后的位设置位结束标志。

//发送文件的内容

while( (tmp= read(f, buf, MAX-1)) && EOF != tmp ){

write(conn_socket, buf, strlen(buf));

}

}

/*

@description:提取url中可用的信息。访问的网页和数据访问方式

@parameter:

conn_socket:与客户端链接的套接字

uri:要处理的url,注意不是浏览器中的url,而是浏览器发送的http请求

@resutl:

*/

int do_uri(int conn_socket, char *uri){

char *p;

p=strchr(uri, '?');

if(p){ *p = 0; p++;}

send_html(conn_socket, uri);

}

void ulog(char *msg){}

void print(char *msg){

ulog(msg);

printf(msg);

}

int main(int argc, char * argv[] ){

int  conn_socket;

int tmp ;

int line ;

struct sockaddr_in client_addr;

char buf[MAX];

int len = sizeof(client_addr);

char method[100],uri[MAX],version[100];

char pwd[1024];

res_socket = socket_listen( "127.0.0.1", 1024) ;

//当按ctrl+c结束程序时调用,使用app_exit函数处理退出过程

signal(SIGINT, app_exit);

while(1){

conn_socket = accept( res_socket, (struct sockaddr * )&client_addr, &len );

printf("reage\n");

line = 0;

//从客户端获取请求信息

while(0 == (tmp = read( conn_socket, buf, MAX-1) ) || tmp != EOF ){

buf[MAX-1]=0;

break;//我只使用了第一行的请求信息,所以丢弃其他的信息

}

//send_http_head(conn_socket, 200, "text/html");

sscanf(buf, "%s %s %s", method, uri, version);

//目前只处理get请求

if(!strcasecmp(method, "get"))

//send_html(conn_socket, "h.html");

do_uri(conn_socket, uri+1);

close(conn_socket);

}

}

void app_exit(){

//回复ctrl+c组合键的默认行为

signal (SIGINT, SIG_DFL);

//关闭服务端链接、释放服务端ip和端口

close(res_socket);

printf("\n");

exit(0);

}

======================================================================

WebService的简单实现的更多相关文章

  1. [转贴]WebService的简单实现 C++

    WebService的简单实现 一.socket主机创建和使用过程 1.socket()//创建套接字 2.Setsockopt()//将套接字属性设置为允许和特定地点绑定 3.Bind()//将套接 ...

  2. webservice Dome--一个webservice的简单小实例

    1.理解:webservice就是为了实现不同服务器上不同应用程序的之间的通讯 2.让我们一步一步的来做一个webservice的简单应用 1)新建一个空的web应用程序,在程序上右键,新建项目,选择 ...

  3. WebService的简单介绍与入门使用

    WebService是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式 ...

  4. 【C#】 创建、部署和调用WebService的简单示例

    C# 创建.部署和调用WebService的简单示例 <div class="postBody"> <div id="cnblogs_post_body ...

  5. C# 创建、部署和调用WebService的简单示例 (转)

    C# 创建.部署和调用WebService的简单示例(转)  转自 https://www.cnblogs.com/Brambling/p/7266482.html  webservice 可以用于分 ...

  6. Java WebService 开发简单实例

    Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service可以执行从简单的请求到复杂商务处理的任何功能.一旦部署以 ...

  7. WebService 超简单入门教程(Java)

    写在前面的话: 当两个人碰面后,产生了好感,如果需要得到双方的信息,那么双方的交流是必不可少的!应用程序也如此, 各个应用程序之间的交流就需要WebService来作为相互交流的桥梁! 项目目的: 程 ...

  8. 使用CXF发布WebService服务简单实例

    一.说明: 前面介绍了使用axis2来发布Webservice服务,现在介绍一种更popular,更高效的Webservice服务发布技术:CXF Apache CXF = Celtix + XFir ...

  9. C# WebService的简单和复杂参数类型和结果的JSON格式

    Jquery作为一款优秀的JS框架,简单易用的特性就不必说了.在实际的开发过程中,使用JQ的AJAX函数调用WebService 的接口实现AJAX的功能也成了一种比较普遍的技术手段了.WebServ ...

随机推荐

  1. 小结php中几种网页跳转

    1.使用网页中<a href=.....></a>实现跳转: 2.<form action="php_request2.php" method=&qu ...

  2. 如何实现TWaver 3D颜色渐变

    一般而言,须要实现3D物体的渐变,通常的思路就是通过2D绘制一张渐变canvas图片作为3D对象的贴图.这样的方式是能够解决这类问题的.只是对于一般用户而言,通过2D生成一张渐变的图片.有一定的难度, ...

  3. CSS背景图片定位

    原文:CSS背景图片定位 在网页开发中我们经常需要对图片进行分割(如下图)来使用,而不是分别提供单独的图片来调用,常见的如页面背景,按钮图标等,这样做的好处就是减少请求次数,节省时间和带宽. 对背景图 ...

  4. Hadoop -YARN 应用程序设计概述

    一概述        应用程序是用户编写的处理数据的统称,它从YARN中申请资源完毕自己的计算任务.YARN自身相应用程序类型没有不论什么限制,它能够是处理短类型任务的MapReduce作业,也能够是 ...

  5. IT行业新名词--透明手机/OCR(光学字符识别)/夹背电池

    透明手机 机身设计的一大关键部分是可替换玻璃的使用,利用导电技术,在看不到线路的环境下,让LED发光. 这样的玻璃内含液晶分子,对于内容的显示则是通过电流对分子的刺激来实现.当手机断电后,分子位置会随 ...

  6. C#中抽象类和接口的区别

    原文:C#中抽象类和接口的区别 大家在编程时都容易把抽象类和接口搞混,下面为大家从概念上讲解抽象类和接口的区别: 一.抽象类: 含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是 ...

  7. 方向梯度直方图(HOG)和颜色直方图的一些比較

    近期在学习视频检索领域的镜头切割方面的知识,发现经常使用的方法是直方图的方法,所以才专门有时间来学习下.查看到这两种直方图的时候,感觉有点接近,好像又不同,放在这做个比較.大部分还是百科的内容,只是对 ...

  8. DDD 回归具体的业务场景,Domain Model 再再重新设计

    DDD 回归具体的业务场景,Domain Model 再再重新设计 首先,把最真挚的情感送与梅西,加油! 写在前面 阅读目录: 重申业务场景 Domain Model 设计 后记 上一篇<设计窘 ...

  9. SpringMVC格式化显示

    SpringMVC学习系列(7) 之 格式化显示 在系列(6)中我们介绍了如何验证提交的数据的正确性,当数据验证通过后就会被我们保存起来.保存的数据会用于以后的展示,这才是保存的价值.那么在展示的时候 ...

  10. C#与Arduino通过串口通信来控制LED灯的状态

    一.引言 最近摆弄了一段时间的Arduino,发现Arduino做一些电子类项目.监控.机器人.电子玩具比较容易,并且Arduino与.NET程序集成也不难.接下来介绍一个简单的小程序,C#做的一个W ...