新用户注册入口 老用户登录入口

[转载]WebService的简单实现

文章作者:转载 更新时间:2023-05-30 18:31:58 阅读数量:89
文章标签:socketTCP通信BindReadWriteGET请求
本文摘要:本文详细介绍了如何基于socket实现简单的WebService,通过创建套接字、设置属性、绑定端口及监听连接请求等一系列步骤(如使用socket()、Bind()、Listen()和Accept()函数),构建TCP通信基础。服务端遵循HTTP传输协议与客户端进行交互,处理GET请求,并通过Read()读取客户端数据,Write()返回格式化的HTTP响应。示例程序展示了如何创建Web服务器,处理GET方法请求以及发送HTML文件内容,同时对404、403等错误状态进行有效反馈。整个过程中涉及的核心关键词包括:WebService、socket编程、HTTP传输协议、TCP通信,以及关键的socket接口函数如Accept()、Bind()、Listen()、Read()和Write(),并特别关注了HTTP中的GET请求处理机制。
转载文章

本篇文章为转载内容。原文链接:https://blog.csdn.net/iteye_9368/article/details/82520401。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

WebService的简单实现

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

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

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

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

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

以下重复进行

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

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

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

二、HTTP传输协议

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

示例:

1、客户端发送HTTP请求

GET/txt?hal=1000HTTP/1.1

Host:localhost:1024

User-Agent:Mozilla/5.0(X11;Linuxi686;rv:2.0)Gecko/20100101Firefox/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.0200OK

Server:ReageWebServer

Content-Type:text/html

<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

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

<!--Copyright(c)2000-2008QuadralayCorporation.Allrightsreserved.-->

<head>

<title>WebWorksHelp5.0</title>

</head>

<body>wuff</body>

</html>

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

三、示例程序

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

/*

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

*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>

#defineMAX1024

intres_socket;

voidapp_exit();

/*

@description:开始服务端监听

@parameter

ip:web服务器的地址

portweb服务器的端口

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

*/

intsocket_listen(char*ip,unsignedshortintport){

intres_socket;//返回值

intres,on;

structsockaddr_inaddress;

structin_addrin_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,(structsockaddr*)&address,sizeof(address));

if(res){printf("portisused,nottorepeatbind\n");exit(101);};

res=listen(res_socket,5);

if(res){printf("listenportiserror;\n");exit(102);};

returnres_socket;

}

/*

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

@parameter

conn_socket:套接字描述符。

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

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

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

*/

voidsend_http_head(intconn_socket,intstatus,char*s_status,char*filetype){

charbuf[MAX];

memset(buf,0,MAX);

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

sprintf(buf,"%sServer:ReageWebServer\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:错误页面信息内容

*/

voidsend_page_error(intconn_socket,intstatus,char*s_status,char*msg){

charbuf[MAX];

sprintf(buf,"<html><head></head><body><h1>%s</h1><hr>ReageWebServer0.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:要发送文件路径

*/

intsend_html(intconn_socket,char*file){

intf;

charbuf[MAX];

inttmp;

structstatfile_s;

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

if(0==strlen(file)){

strcpy(file,"index.html");

}

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

if(stat(file,&file_s)){

send_page_error(conn_socket,404,"Notfound","Notfound<br/>Reagedoesnotimplementthismothod\n");

return0;

}

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

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

send_page_error(conn_socket,403,"Forbidden","Forbidden<br/>Reagecouldn'treadthefile\n");

return0;

}

//发送头文件,现在只提供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,"Notfound","Notfound<br/>Reagecouldn'treadthefile\n");

return0;

}

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

*/

intdo_uri(intconn_socket,char*uri){

char*p;

p=strchr(uri,'?');

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

send_html(conn_socket,uri);

}

voidulog(char*msg){}

voidprint(char*msg){

ulog(msg);

printf(msg);

}

intmain(intargc,char*argv[]){

intconn_socket;

inttmp;

intline;

structsockaddr_inclient_addr;

charbuf[MAX];

intlen=sizeof(client_addr);

charmethod[100],uri[MAX],version[100];

charpwd[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,(structsockaddr*)&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);

}

}

voidapp_exit(){

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

signal(SIGINT,SIG_DFL);

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

close(res_socket);

printf("\n");

exit(0);

}

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


本篇文章为转载内容。原文链接:https://blog.csdn.net/iteye_9368/article/details/82520401。

该文由互联网用户投稿提供,文中观点代表作者本人意见,并不代表本站的立场。

作为信息平台,本站仅提供文章转载服务,并不拥有其所有权,也不对文章内容的真实性、准确性和合法性承担责任。

如发现本文存在侵权、违法、违规或事实不符的情况,请及时联系我们,我们将第一时间进行核实并删除相应内容。

相关阅读
文章标题:[转载][洛谷P1082]同余方程

更新时间:2023-02-18
[转载][洛谷P1082]同余方程
文章标题:[转载]webpack优化之HappyPack实战

更新时间:2023-08-07
[转载]webpack优化之HappyPack实战
文章标题:[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法

更新时间:2023-09-10
[转载]oracle 同时更新多表,在Oracle数据库中同时更新两张表的简单方法
文章标题:[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo

更新时间:2024-03-11
[转载][Unity] 包括场景互动与射击要素的俯视角闯关游戏Demo
文章标题:[转载]程序员也分三六九等?等级差异,一个看不起一个!

更新时间:2024-05-10
[转载]程序员也分三六九等?等级差异,一个看不起一个!
文章标题:[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集

更新时间:2024-01-12
[转载]海贼王 动漫 全集目录 分章节 精彩打斗剧集
名词解释
作为当前文章的名词解释,仅对当前文章有效。
WebServiceWebService是一种软件系统设计模式,它通过标准的网络协议(如HTTP、HTTPS)提供应用程序间交互的能力。在本文中,WebService指的是基于socket编程和HTTP协议实现的一种服务端程序,允许客户端通过发送特定格式的HTTP请求获取或更新服务器上的数据资源。
套接字(Socket)在计算机网络编程中,套接字是一种通信机制,它是进程间通信的端点,用于在网络的不同主机之间建立连接并交换数据。在文章所描述的场景下,套接字是Web服务器与客户端进行TCP通信的基础结构,通过调用socket()函数创建,并通过一系列如Bind()、Listen()和Accept()等操作来管理和维护与客户端的连接及数据传输过程。
HTTP传输协议HTTP(HyperText Transfer Protocol,超文本传输协议)是一种应用层协议,常用于分布式、协作式和超媒体信息系统的应用中。在本文上下文中,HTTP传输协议定义了客户端(如Web浏览器)与服务器之间的通信格式和规则,包括请求消息的结构(如GET、POST方法以及URL、头部信息等组成部分)、响应消息的结构(如状态码、头部信息和消息体)等。通过遵循HTTP协议,Web服务器可以接收和解析客户端的请求,然后按照指定格式返回响应内容给客户端。
延伸阅读
作为当前文章的延伸阅读,仅对当前文章有效。
在进一步理解了WebService的简单实现原理,以及如何通过socket编程与HTTP传输协议相结合搭建Web服务器后,您可能会对以下内容感兴趣:
随着云原生和微服务架构的普及,基于RESTful API设计原则的WebService已成为现代应用开发的标准实践。最新的API网关技术如Kong、Envoy等,不仅提供了统一的安全认证、限流熔断等治理能力,还能简化WebService接口的管理和部署。例如,一篇近期的技术文章《使用Kong构建可扩展的微服务API网关》深入探讨了如何利用此类工具优化WebService性能,并确保其在大规模分布式环境中的高可用性。
另外,HTTP/3作为HTTP协议的最新版本,正在逐步被各大主流浏览器及服务器支持。相较于HTTP/1.1和HTTP/2,HTTP/3引入了QUIC协议,提供更快的连接建立速度、多路复用无阻塞传输,有效解决了延迟和丢包问题。阅读关于HTTP/3的最新研究与实践案例,比如《HTTP/3:下一代互联网传输协议的变革与应用》,将有助于我们掌握未来WebService通信的新趋势和技术细节。
此外,对于安全防护方面,随着网络攻击手段的日益复杂化,保障WebService的安全性至关重要。一篇题为《深度解析:如何强化你的WebService安全防护体系》的文章详述了多种常见的安全威胁及应对策略,包括但不限于DDoS防御、SQL注入防范、OAuth2.0授权机制的应用等,这对于提升自建WebService的安全等级具有极高的参考价值。
综上所述,在实际开发和运维过程中,结合最新的技术和最佳实践,不断优化和完善WebService的实现方案,既能提高系统的稳定性和效率,也能确保其在面对各种挑战时具备足够的安全性和适应性。
知识学习
实践的时候请根据实际情况谨慎操作。
随机学习一条linux命令:
tar -czvf archive.tar.gz dir - 创建一个gzip压缩的tar归档文件。
随便看看
拉到页底了吧,随便看看还有哪些文章你可能感兴趣。
HessianRPC在高负载下服务降级与熔断器模式保障用户体验 05-01 jQuery和TweenMax简单实用的水平手风琴特效 01-20 jquery选择国家下拉列表框插件 01-21 Sqoop在Hadoop集群中的数据传输机制及数据库迁移、收集与备份恢复应用实践 12-23 简约渔具批发牧渔企业类网站前端模板下载 11-09 基于bootstrap功能齐全的jQuery进度条插件 10-20 简约大气男性护肤产品HTML5网站模板 09-22 宽屏大气机械设备制造公司网站模板 08-13 演讲会门票销售网站模板下载 07-30 本次刷新还10个文章未展示,点击 更多查看。
经典响应式投资理财企业前端模板 06-26 基于Redis的键值对存储实现用户阅读状态跟踪与管理 06-24 Netty框架中CannotFindServerSelection异常:服务器地址配置错误与通道类型匹配详解 06-18 简洁设计公司响应式网站模板下载 05-06 绿色苗木草坪种植绿化类企业前端CMS模板下载 04-30 怎么在cmd开启mysql服务 04-15 保洁公司家庭保洁服务网站模板 03-26 SpringCloud微服务中分布式锁的死锁问题与状态一致性维护:避免循环依赖、公平锁及超时重试机制在Redisson中的实践运用 03-19 HBase性能测试与RegionServer配置、架构及数据模型调优实践:关注响应时间、并发处理能力与BlockCache优化 03-14 jquery控制radio触发事件 02-15 简约HTML5软件营销业务公司网站模板 02-09
时光飞逝
"流光容易把人抛,红了樱桃,绿了芭蕉。"