WebService的简单实现
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的简单实现的更多相关文章
- [转贴]WebService的简单实现 C++
WebService的简单实现 一.socket主机创建和使用过程 1.socket()//创建套接字 2.Setsockopt()//将套接字属性设置为允许和特定地点绑定 3.Bind()//将套接 ...
- webservice Dome--一个webservice的简单小实例
1.理解:webservice就是为了实现不同服务器上不同应用程序的之间的通讯 2.让我们一步一步的来做一个webservice的简单应用 1)新建一个空的web应用程序,在程序上右键,新建项目,选择 ...
- WebService的简单介绍与入门使用
WebService是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序,用于开发分布式 ...
- 【C#】 创建、部署和调用WebService的简单示例
C# 创建.部署和调用WebService的简单示例 <div class="postBody"> <div id="cnblogs_post_body ...
- C# 创建、部署和调用WebService的简单示例 (转)
C# 创建.部署和调用WebService的简单示例(转) 转自 https://www.cnblogs.com/Brambling/p/7266482.html webservice 可以用于分 ...
- Java WebService 开发简单实例
Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service可以执行从简单的请求到复杂商务处理的任何功能.一旦部署以 ...
- WebService 超简单入门教程(Java)
写在前面的话: 当两个人碰面后,产生了好感,如果需要得到双方的信息,那么双方的交流是必不可少的!应用程序也如此, 各个应用程序之间的交流就需要WebService来作为相互交流的桥梁! 项目目的: 程 ...
- 使用CXF发布WebService服务简单实例
一.说明: 前面介绍了使用axis2来发布Webservice服务,现在介绍一种更popular,更高效的Webservice服务发布技术:CXF Apache CXF = Celtix + XFir ...
- C# WebService的简单和复杂参数类型和结果的JSON格式
Jquery作为一款优秀的JS框架,简单易用的特性就不必说了.在实际的开发过程中,使用JQ的AJAX函数调用WebService 的接口实现AJAX的功能也成了一种比较普遍的技术手段了.WebServ ...
随机推荐
- XShell删除键之类的不正常
异常处理汇总-开发工具 http://www.cnblogs.com/dunitian/p/4522988.html 一图解决 异常处理汇总:http://www.cnblogs.com/dunit ...
- 当今最流行的Node.js应用开发框架简介
快速开发而又容易扩展,高性能且鲁棒性强.Node.js的出现让所有网络应用开发者的这些梦想成为现实.但是,有如其他新的开发语言技术一样,从头开始使用Node.js的最基本功能来编写代码构建应用是一个非 ...
- 【转】关于“ORA-01653: 表 SYS.AUD$ 无法通过 128 (在表空间 SYSTEM 中) 扩展”的错误
SQL*Plus: Release 11.1.0.6.0 - Production on 星期一 5月 17 18:31:08 2010 Copyright (c) 1982, 2007, Oracl ...
- CodeSmith 生成代码
使用CodeSmith 生成代码 CodeSmith是一款优秀的代码生成工具.在ORM中,它能帮助我们生成实体类.XML配置文件,从而简化了我们一部分的开发工作.下面简要说说它的基本用法. 1. 打 ...
- javascript的预编译和执行顺序
原文:javascript的预编译和执行顺序 最近在复习javascript的事件处理时发现了一个问题,然后也是我来写javascript的预编译和执行顺序的问题 代码: 代码一<html> ...
- [转]C/C++:构建你自己的插件框架
本文译自Gigi Sayfan在DDJ上的专栏文章.Gigi Sayfan是北加州的一个程序员,email:gigi@gmail.com. 本文是一系列讨论架构.开发和部署C/C++跨平台插件框架的文 ...
- 添加MySql Metat Database 信息
有时候我们想看看 一个数据库上面 某种元素(比如表名)的所有信息,在Mysql上 我们可以通过引入information_schema 的方式,就可以非常方便的查看到. 添加步骤 Edit->P ...
- 入门 ASP.NET Web API 2 (C#)
入门 ASP.NET Web API 2 (C#) HTTP 不只是为了生成 web 页面.它也是一个强大的建设公开服务和数据 Api的平台. HTTP 的特性:简单. 灵活和无处不在.你能想到的几乎 ...
- openGL绘制正方形
/** * 缓冲区工具类 */public class BufferUtil { /** * 将浮点数组转换成字节缓冲区 */ public static ByteBuffer arr2ByteB ...
- 【分享】史上最全的Python电子书教程资源下载
网上搜集的,点击即可下载,希望提供给有需要的人^_^ O'Reilly.Python.And.XML.pdf 2.02 MB OReilly - Programming Python 2nd. ...