前言:中文期刊网精心挑选了http协议范文供你参考和学习,希望我们的参考范文能激发你的文章创作灵感,欢迎阅读。
http协议范文1
程序实现过程:
1.分析链接关系(限于篇幅,这里只介绍对锚标记〈a〉的分析)。
在html中〈a〉标记的基本语法为:〈a href=″...″ name=″...″ target=″...″〉。其中参数href的值就是欲获取的url值。
2.下载。
在http协议中常用的请求方法有两种:get和post。本实现使用get方法。最简化的get请求包如下:
get /index.htm http/1.1
“/index.htm”表示客户端欲下载的文件路径;“http/1.1”表示协议版本。
程序生成get请求包,在成功连接对应web服务器的80或其它端口后,使用基于tcp协议的同步模式套接字发送请求包并等待返回信息。
服务器将返回一个应答包,大致如下:
http/1.0 200 ok
...
[数据...]
第一行是应答信息。如果成功,服务器将返回“http/1.0 200 ok”。
第三行是一个空行,用以分隔http包头和包体(数据)。
第四行开始就是以字节流的方式返回的数据。
如果使用http,则与上述有两点不同。
第一, 连接时应连接服务器,而不是连接web服务器。
第二,在生成请求包时,下载文件的url必须写全url。对上例而言,请求应为“get netsport/index.htm http/1.1”,而不是“get /index.htm http/1.1”。
具体程序和类(程序使用delphi3.0编制):
1.初始化winsock。
procedure tform1.formcreate(sender: tobject);
var
wversionrequired: word;
wsdata: twsadata;
begin
ismultithread:=true;
//置″支持多线程″为″真″
wversionrequired:=makeword(2,0);
case wsastartup(wversionrequired,wsdata) of //初始化winsock
wsasysnotready :
application.messagebox(′网络系统未准备′,′信息′,mb_ok);
wsavernotsupported :
application.messagebox(′未提供网络接口′,′信息′,mb_ok);
wsaeinval :
application.messagebox(′网络版本不被支持′,′信息′,mb_ok);
end;
end;
2.文件下载线程。
tdownfilethread = class(tthread)
private
fileurl:string;
//记录文件的url
protected
procedure execute; override;
public constructor create(url:string);
end;
constructor tdownfilethread.create(url:string);
begin
fileurl:=url;
freeonterminate:=true;
inherited create(false);
end;
procedure tdownfilethread.execute;
var
mysocket:tsocket; myclient:tsockaddr;
recvbuf:array [0..332] of char; mycmdstr:string;
ptemp:pchar;
myhandle,index_ch,reccount,i:integer;
begin //创建本地socket
mysocket:=socket(af_inet,sock_stream,0);
if (mysocket=socket_error) then begin
application.messagebox(′初始化失败!′,′信息′,mb_ok);
exit;
end; //生成连接主机的结构
myclient.sin_family:=af_inet;
myclient.sin_port:=htons(connectedport);
// connectedport:全局变量,记录连接端口号
strpcopy(recvbuf,getserverip(fileurl));
// getserverip(fileurl):返回服务器的ip
myclient.sin_addr.s_addr:=inet_addr(recvbuf); //连接服务器
if (connect(mysocket,myclient,sizeof(myclient))〈〉0) then begin
closesocket(mysocket);
exit;
end; //发请求
if (q_useproxy=0) then
mycmdstr:=′get ′+extracturlpath(fileurl)+′ http/1.1′
//extracturlpath(fileurl)返回相对url
else mycmdstr:=′get ′+fileurl+′ http/1.1′;//使用写全url
strpcopy(recvbuf,mycmdstr);
i:=length(mycmdstr);
recvbuf[i]:=#13; inc(i); recvbuf[i]:=#10; inc(i);
recvbuf[i]:=#13; inc(i); recvbuf[i]:=#10; inc(i);
recvbuf[i]:=#0;
send(mysocket,recvbuf,i,0);
//发送请求读返回数据
reccount:=recv(mysocket,recvbuf,sizeof(recvbuf)-1,0); //判断是否成功
i:=0;
while i〈10 do begin
i:=i+1;
// ′http/1.0 200 ok′是成功标志
if ((recvbuf[i]=′ ′) and (recvbuf[i+1]=′2′) and (recvbuf[i+2]=′0′)
and (recvbuf[i+3]=′0′) and (recvbuf[i+4]=′ ′)) then i:=200;
end;
if i〈〉200 then begin closesocket(mysocket); exit; end;
//得到数据起始位置
ptemp:=strpos(recvbuf,#13+#10+#13+#10)+4;
index_ch:=ptemp-recvbuf;
//建立下载目录
try forcedirectories(extractfilepath(getfillocalpath(fileurl)));
except
end; //创建文件
deletefile(getfillocalpath(fileurl));
myhandle:=filecreate(getfillocalpath(fileurl)); //如果未接收完则继续
while (reccount〈〉0) do
begin
filewrite(myhandle,recvbuf[index_ch] ,reccount-(index_ch));
index_ch:=0;
reccount:=recv(mysocket,recvbuf,sizeof(recvbuf)-1,0);
end; //关闭文件句柄和套接字
fileclose(myhandle);
http协议范文2
关键词:Photoshop;选区;教学方法
中图分类号:G642 文献标识码:A 文章编号:1009-3044(2015)22-0087-02
随着多媒体在教育培训领域、电子出版领域、娱乐领域、咨询服务领域、多媒体网络通信领域等领域的全面应用,作为图形、图像的主要处理软件Photoshop被广泛使用。各大高校也相继开设了《Photoshop》这门课程。《Photoshop》是一门操作、性实践性都十分强的学科。学习内容丰富,涉及到的基本概念、知识点也偏多,基本工具十分丰富。在教学过程中让学生掌握基本操作,模仿书本做出一些图例只是 Photoshop 的初级教学目标,而更高层次的教学目标是充分调动学生的学习积极性,发挥学生的主动性和想象力,让他们根据已掌握的知识、技能创造性地设计出有创意的作品,培养他们的实践能力和终身学习思想。但对于没有接触过图像处理软件的学生来说,要在短时间内熟练掌握并灵活运用软件并不容易。因此要使学生学好这门课,不但要从软件使用的角度来考虑教学,更要从学生易于掌握、灵活使用的角度来考虑如何教好这门课程,特别要考虑如何激发学生浓厚的学习兴趣,培养学生的创造力、想象力及美感等综合素质[1]。结合自己的教学经验,对教学中遇到的一些问题提出自己的一点想法跟大家探讨。
1 Photoshop中椭圆选区或圆选区的选择
如图1所示图片,我们如何使用椭圆选框工具选取杯子的杯口椭圆。要画出一个跟杯口一样大的椭圆几乎要尝试很多次,有没快速准确的方法一次画成呢?这就是要让同学思考的问题,通过任务驱动学生积极思考。提示学生使用参考线和椭圆公式。经过一段时间的思考绝大部分同学是没有找出答案的。然后开始再开始讲解,学生势必认真听讲。
第五部,视图菜单下,清除参考线。
通过实例探讨、思考、讲解,锻炼了学生独立思考的能力。
2 photoshop中图像下的调整与图层下的调整图层的区别
在对讲解调整图像的色彩时,讲解了图像菜单下的调整下的各个菜单命令,在对图层讲解时,图层下有新建调整图层,在该菜单下的命令选项与图像菜单下的调整下的各个菜单命令相同。同一个图像我们使用上面2种操作都能得到一样的效果。两种操作有什么区别?这个问题抛给同学,让他们进行讨论。通常调整图层的讲解是在图像调整的后面,通过这个问题可以让同学对图像调整进行复习,也加上了对调整图层的影响。使用图像调整是直接在图像的图层上对图像进行修改调整,原始图像的信息不被保留,这种操作只有一个图层如图4。使用调整图层调整时所用的调整信息都在调整图层上,原图像的信息没有被改变,需要还原图像,只需要删除调整图层或隐藏调整图层即可,如图5所示。
3 在教学工程中给出实例操作的详细步骤
要快速掌握photoshop的使用技巧,需要通过大量的实践操作练习,如果每个例子都让同学自己看书操作,一定会花费很多时间。给出详细的操作步骤很有必要。例如:实际操作讲解;半身照照片背景颜色替换:
S1:文件->打开->第一讲/证件照.jpg;
S2: 鼠标右击背景图层->复制背景图层;
S3:选择复制的背景图层->图像->调整->颜色替换;对话框中,颜色容差调整为200,替换颜色选取蓝色;
S4:选择副本->添加矢量蒙版->前景色和背景色进行替换->前景色为黑色;
S5:调整画笔大小->对不需要遮挡部分;
S6:调整副本亮度为24,对比度为6。
把学习的重点放在具体实例的制作过程上,命令的使用尽量不单独讲解和单独练习,而是把要学习的命令融入到一个个生动的具体案例中,既讲理论,又讲实践,深入浅出,通俗易懂,可增强对教学内容的理解与记忆,还可使学生形成科学的思维模式。实例教学法可通过典型例子,将学生带入特定事件使学生在独立思考或集体协作的状态下,进一步提高其识别、分析和解决某一具体问题的能力,进而培养学生的自主学习能力、沟通能力、职业能力和协作精神,提高学生的综合素质[2]。
4 结束语
Photoshop图像处理是一门很生动有趣的课程,学生的学习积极性很高;只要通过正确的教学方法,一定能引导学生把这门课程给学习好。
参考文献:
http协议范文3
关键词:DHCP服务器;网络参数;Packet Tracer
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2014)22-5178-02
DHCP(Dynamic Host Configuration Protocol)是基于客户机/服务器模式,用来为网络客户机提供动态网络参数配置的协议[1]。其中DHCP服务器需要负责地址池及相关IP信息的申请和分配管理,要求能够响应网络主机的配置请求,并返回网络ID、子网掩码、默认网关、DNS服务器等网络参数给客户机,在DHCP协议实现中有着重要的作用。DHCP服务器既可以使用专用的服务器,也可以由路由器来完成相关的IP地址分配。文章中探讨的是如何使用路由器来完成DHCP服务器的功能,以及跨网段时相关路由器的设置,并在Packet Tracer环境下完成了相应配置的仿真实现。
1 网络需求分析
实验要求对于两台路由器所连接的六个子网进行连接,并要求在路由器上进行DHCP服务器的配置,来满足各子网中主机对于IP地址的动态请求。根据设计要求,设计了如图1所示的网络拓扑结构。
其中路由器1与路由器2分属于172.16.0.0/24和192.168.1.0/24网络,每个网络又划分出三个虚拟局域网(VLAN)[2],共六个子网:Vlan15、Vlan25、Vlan35、Vlan10、Vlan20、Vlan30。根据实际网络容量需求,可以在路由器上使用应用802.1q协议的单臂路由[3],并采用VLSM[4]技术来划分子网。各子网相关配置要求如表1所示:
2 配置实现
作为Cisco公司的一款网络学习软件,Packet Tracer能够有效地模拟网络运行环境,进行相关的网络设计、配置及故障排查等,尤其为路由器和交换机的学习提供了优秀的平台。在设计中选择路由器2作为DHCP服务器,在路由器1上设置“路由助手”,来满足各子网的IP地址请求。
在路由器2上,对于各子网的有效地址池(包括保留地址)、默认网关、DNS服务器累进行配置。以Vlan10的配置为例,可以在路由器的全局配置模式下,使用如下命令实现:
为了能够对于非直连网络内的主机进行IP地址请求响应,除了要保证网络的通畅连接之外,需要在作为网关的路由器1上设置“路由助手”,其IP helper address指向相连的路由器2(DHCP服务器)。
路由器1采用802.1q协议,对于Vlan15的相关配置如下:
3 测试
在各主机可以进行测试,如选择属于Vlan15的PC7,在命令提示符下使用“ipconfig /all”命令,可以查看当前通过DHCP得到的相关网络信息:
PC1和PC7都成功使用DHCP,自动完成了相关网络信息的配置。
在PC1中,使用“ping”命令进行与PC7的连接测试,得到如下响应:
4 小结
本次测试在Packet Tracer环境下,顺利实现了DHCP协议的配置,完成了不同网络中主机对于IP地址及相关网络参数的自动分配,进行了作为DHCP服务器的路由器及相关路由器的设置,对于网络设计的测试、网络架构的模拟实现以及DHCP在教学与研究中的应用都可以提供很好的借鉴。
参考文献:
[1] Droms, R..Dynamic Host Configuration Protocol[J]. RFC 2131, March 1997.
[2] McPherson, D. and B. Dykes.VLAN Aggregation for Efficient IP Address Allocation[J] .RFC 3069, February 2001.
http协议范文4
关键词:HTTP;HTTP协议;服务器
中图分类号:TP393文献标识码:A文章编号:1009-3044(2012)02-0282-03
1 HTTP协议介绍
1.1 HTTP协议
HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。本程序实现的是一个轻量级的web服务器。【1】
1.2 HTTP组成
HTTP请求由三部分组成,分别是:请求行、消息报头、请求正文。
1)请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF。其中Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。
2)HTTP响应由三个部分组成,分别是:状态行、消息报头、响应正文。
状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF,其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种
可能取值:【2】
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
常见状态代码、状态描述、说明:
200 OK//客户端请求成功
400 Bad Request//客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden//服务器收到请求,但是拒绝提供服务
404 Not Found//请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable//服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。
3)请求正文。
2 HTTPSVR程序功能
2.1工作原理
建立在请求/响应模式(Request/Response)上:一个客户端与服务器建立连接后,客户端向Web服务器发出一个HTTP请求行;Web服务器在收到有效的请求后,返回一个状态行或多个响应标题、一个空白行和相关文档。HTTP协议使用的端口号,通常为80。
2.2工作流程图
HTTPSVR的信息交换过程,它分四个过程:建立连接、发送请求信息、获取服务器响应状态、关闭连接。其中较为复杂的过程是:发送请求信息、获取服务器响应状态。【3】如图1所示:
图1工作流程图
1)建立连接:连接的建立是通过申请套接字(Socket)实现的。客户打开一个套接字并把它约束在一个端口上,如果成功,就相当于建立了一个虚拟文件。以后就可以在该虚拟文件上写数据并通过网络向外传送。
2)发送请求:打开一个连接后,客户机把请求消息送到服务器的停留端口上,完成提出请求动作。
3)发送响应:服务器在处理完客户的请求之后,要向客户机发送响应消息。
4)关闭连接:客户和服务器双方都可以通过关闭套接字来结束TCP/IP对话。
3 HTTPSVR程序分析
基于HTTPSVR所用到的类进行分析:
1)CGenPage类(genpage.h/.cpp):这是通用设置的属性对话框,是UI的一部分,设置属性中的一般属性,其中包括:服务器视图界面的列表显示、访问日志、图标显示三个属性。
2)CHitDoc类(http.h/.cpp):这是http响应类,处理客户端请求的URL地址,并且进行本地地址转化,指向服务器资源目录。
3)CHitDoc(httpDoc.h/.cpp):这是mfc的doc视图主类。
4)CHttpSvrApp(httpsvr.h/.cpp):这是处理web服务器的初始化,包括访问目录、登录日志、HTTP端口的设置、文件的保存等。
5)CHttpSvrView(httpview.h/.cpp):这是UI中的日志列表控件,主要是客户登录服务器的访问的记录和错误记录的显示,包括文件的路径,用户登录时间,用户访问次数等。
6)CListenSocket(listen.h/.cpp):这是监听套接字的拓展类,用于创建服务器在端口(默认80端口)上的监听套接字。
7)CNamePage(namepage.h/.cpp):这是一般属性中的Server Name属性页,是UI的一部分,其中包括服务器名称的设置和端口的设置,而服务器名称有默认和指定的两种情况。
8)CNoRootDlg(NoRoot.h/.cpp):这是服务器地址属性设置对话框,是UI的一部分。在此部分中,如果URL不存在则会弹出此对话框,让我们输入正确的URL地址。
9)CRequestSocket(reqsock.h/.cpp):这是服务器的主要功能实现部分,包括接受、发送数据,并且支持cgi的动态生成页面,详细的功能有:接收请求,对http请求报文进行解析,根据请求内容构造响应报文。
10)CRequest(Request.h/.cpp):实现保存上一次web请求的内容。
11)CRootPage(RootPage.h/.cpp):这是一般属性中Root Dir对话框,是UI的一部分。在此部分我们可以对服务器的资源根目录进行设置,同时也可以重置为默认的根目录G:\WebPages。
12)CasyncSocket(AsyncSock.h /.cpp):这是异步非阻塞类,它的Create()函数,除了创建了一个SOCKET以外,使用WSAAsyncSe? lect()将这个SOCKET与该窗口对象关联,以让该窗口对象处理来自Socket的事件(消息),然而CSocketWnd收到Socket事件之后,只是简单地回调CAsyncSocket::OnReceive() CAsyncSocket::OnSend(),CAsyncSocket::OnAccept(),CAsyncSocket::OnConnect()等虚函数。所以CAsyncSocket的派生类,只需要在这些虚函数里添加发送和接收的代码。
使用CAsyncSocket时,如果使用Create缺省创建socket,则所有网络I/O都是异步操作,进行有关网络数据传输时需要用到以下函数:OnAccept、OnClose、OnConnect、OnOutOfBandData、OnReceive、OnSend。【4】
4 HTTPSRV服务器程序分析流程
4.1执行函数
服务器程序分析首先在MFC中的文件APPMODULE.CPP的_tWinMain函数处开始执行,执行该文件的return AfxWinMain函数。
4.2客户端链接服务器
在服务器程序中由AfxWinMain函数负责建立工作线程pWinThread,此线程对HttpSvr进行初始化工作,接着调用HttpSvr.cpp文件中的BOOL CHttpSvrApp::InitInstance方法对WEB服务器进行初始化,然后运行线程的主函数,最后在THRDCORE.CPP文件中运行int CWinThread::Run函数,开始HTTP服务器的循环。在循环中,首先通过CListenSocket::OnAccept( int nErrorCode )函数生成CRe? questSocket类,将其设置用于监听8080端口。监听到连接请求时,Accept函数创建新的套接字pRequest并返回句柄,AsyncSelect函数监听8080端口的FD_READ和FD_CLOSE两个事件,当传入FD_READ事件时,准备接收,并且触发OnReceive()函数,如果传入FD_WRITE事件,发送数据的时候,OnSend()函数就会触发。设置端口为8080,将web服务文件夹地址Root Dir指向root所在地址。此时显示结果如图2所示。
图2链接服务器
4.3请求客户
一旦有数据到达时,执行ReqSock.cpp中的void CRequestSocket::OnReceive(int nErrorCode)函数。程序代码将传输控制层上传的数据包存放在请求和应答报文的缓冲区m_buf中。
接下来在ReqSock.cpp文件中,根据响应状态m_reqStatus的不同,使用swich语句对接收到的数据包进行不同的响应处理。当浏览窗口发送第一个数据包时,响应状态m_reqStatus被设置为REQ_REQUEST,之后,对请求数据包的每一行进行处理,根据http的协议使用ProcessLine方法对m_pRequest进行初始化,完成以上操作之后,当请求状态m_reqStatus == REQ_DONE,调用判断StartRe? sponse方法来构造应答报文,运行AsyncSelect( FD_WRITE | FD_CLOSE )函数,之后其调用void CRequestSocket::OnSend(int nError? Code)方法将缓存m_buf的应答报文发送给客户端。【5】
5结论
该文通过对基于HTTP协议服务器程序以及浏览器与服务器的交互过程的分析,熟悉了HTTP协议的服务工作流程,对运用Winsock编程来逐步解析HTTP协议的服务器程序的核心部分有更深层次的了解。在本程序中是通过多线程与异步操作的理论的方法来实现多个客户端同时访问的处理,同时熟悉了多线程的创建过程以及异步操作理论,了解了各个线程间是如何协作的。
不足的是,本实例程序实现的只是一个轻量级的服务器,它的分析过程相对比较简单。但是只要熟悉了基于HTTP协议服务器创建的基本原理,将来就能在此基础上实现功能更加强大的服务器。
参考文献:
[1]叶强.超文本传输协议-HTTP/1.0[J].科技情报开发与经济,2004(8):66-68.
[2] Fielding R, Gettys J, Mogul J, Frystyk H. RFC 2068 Hypertext Transfer Protocol-HTTP/1.1. MIT/LCS, UC Irvine,1997(1):37-38.
[3]蔡皖东. HTTP协议的传输机制与超文本链的研究[J].微电子学与计算机,1997(4):53-55.
http协议范文5
引言
控制网络一般指以控制“事物对象”为特征的计算机网络系统,简称Infranet(infrastructure network),它处在企业网(Intranet)的底层,构成了整个企业网的基础。近些年来,在控制网络中采用了现场总线(Field Bus)和工业以太网(Ethernet)两种技术。出现这种情况主要有两个原因:第一,目前存在多种现场总线标准,不同的标准采用完全不同的通信协议,也就是说现场总线的开放性不够;第二,以太网虽然能够解决开放性的问题,并具备成本低廉、技术成熟等优点,但由于以太网最初是被设计用于以资源共享为目的的计算机局域网,因此在实时性和可靠性上暂时还不能完全满足工业控制的要求。事实上,目前一个较大规模的控制网络往往综合采用了这两种技术。在现场层,由于强调实时性、可靠性和安全性,常采用现场总线技术;在监控管理层,考虑到采用不同标准的控制网段之间的集成以及与高层企业信息网络的集成,一般采用以太网技术。现场层的现场总线控制系统FCS(Field Control System)或其它设备级轻质网络通过网关或嵌入式HTTP服务器与高层以太网相连。这样,不仅采用不同协议的控制网段能够实现互联,而且各个控制网段能方便地与高层企业信息网互通,从而最终实现企业网的管控一体化和对现场设备的Internet远程监控。通过以上分析可以看出,控制网络中的网关或嵌入式HTTP服务器起着连接现场层和监迭管理层的作用,因此它是整个控制网络的关键设备。
网关或嵌入式HTTP服务器与传统的嵌入式系统相比,有一些不同的特性。传统的嵌入式系统是面向应用、有一些不同的特性。传统的嵌入式系统是面向应用、面向产品的,强调成本和高效设计系统,因此本质上不具备通用性和可移植性。网关或嵌入式HTTP服务器由于处在现场层和监控管理层的中间,因此它与具体应用和产品是一种弱耦合的关系。同时,技术发展的趋势是:硬件成本越来越低,功能越来越强,越来越多的芯片和板卡具备“平台”的特点,适用于多种应用场合。嵌入式实时操作系统(Embedded Real Time Operationg System)的发展更是为嵌入式软件提供了一个通用的软件平台。综上所述,在网关或嵌入式HTTP服务器设计中,考虑通过选用适合的硬件和嵌入式实时操作系统,使整个系统具备相当的通用性和可移植性。对于连接不同的设备级轻质网络或不同的应用,只需要通过更换硬件模块和对代码作最小的修改即可实现。
1 基于Linux的嵌入式HTTP服务器的结构
为了实现设计目标,嵌入式HTTP服务器一般应采用功能较强的能用PC、工业PC、或高档MPU作为硬件平台,嵌入式实时操作系统作为软件平台进行平发。硬件平台应具备以太网口和一个或多个通信模块,比如RS232、RS485、CAN通信卡等。嵌入式实时操作系统实现了TCP/IP等网络协议,并提供实时任务、进程管理、内存管理、文件系统、API等功能。
Linux操作系统是一种多进程,多用户的通用操作。由于它具备免费、源码公开、内核可裁减、支持多线程、网络功能强大、设计精巧、性能稳定的特点,因此近年它也被广泛用到嵌入式系统的设计中。一个应用于嵌入式系统的Linux经过裁减和重新编译后只包括进程管理、内存管理、文件系统、若干个驱动程序和实用的函数等。
下面以本人参与的转子秤控制系统为例来说明一个基于Linux的嵌入式HTTP服务器的结构。转子秤是水泥工业中的关键计量喂料设备,一条大型的生产线需要许多台转子秤,对转子秤的控制涉及到重量、转速、温度、一氧化碳含量等若干个参量。由于现场环境的高噪声、高粉尘、高电磁干扰,无法在现场配备键盘、显示器、触摸屏等人机交互设备,无法在现场实现对设备的监控和维护。同时,一条生产线有多台转子秤,为每台转子秤配备人机交互设备也是不经济的。为此,考虑为整个系统设计一个嵌入式HTTP服务器,各转子秤控制器与嵌入式HTTP服务器用CAN总线相连。通过嵌入式HTTP服务器实现对整个系统的在线监控和远程监控。在嵌入式HTTP服务器的设计中,选用研祥公司PC104总线的486X嵌入式CPU卡作为硬件平台,该板卡是具有128MB的在板ROM、CF卡接口和以太网接口等。选择该板卡的原因是PC104总线的功能扩展模块非常丰富,通过选择不同的模块很容易就支持多种总线。软件平台方面,选用Linux2.0内核并对它作适当裁减。整个嵌入式HTTP服务器的结构简图如图1所示。
2 基于Linux的嵌入式HTTP服务器的设计
工控领域的嵌入式HTTP服务器应该具备如下基本功能。
①实时数据。实时数据主要包括系统运行过程中设备的各种状态信息。嵌入式HTTP服务器将实时数据以网页形式到Internet上,且动态实时刷新。客户可以通过浏览器访问这些实时信息。
②参数设置。参数包括运行参数和设备状态参数,如各种初始值、常数等。嵌入式HTTP服务器接收到客户提交的参数设备请求后,执行参数写入操作。
③远程实时控制。远程实时控制允许远程用户在线地控制系统中的相应执行机构,比如电机、电磁阀等。嵌入式HTTP服务器接收到远方客户提交的控制操作请求后,将下发控制命令驱动监控系统中相应的执行机构。
④访问级别设置和权限认证。只有权限不低于要求访问级别的客户,经嵌入式HTTP服务器认证后,方可进行其权限范围内的监控操作。
3 主要实现技术
3.1 超文本传输协议
HTTP协议是一个面向事务、无状态的应用层协议。在传输层,HTTP协议使用请求(request)/响应(response)模型。一次简单的HTTP事务包括以下过程。首先,客户(浏览器)发起和建立一条到服务器的TCP连接。然后,客户发送一个HTTP请求到服务器,请求包含方法、URI、协议版本和一个类MIME报文。服务器解析HTTP请求后,给出相应的HTTP响应,响应包括协议版本、状态码、解释状态码的简短短语和一个类MIME报文。最后,释放TCP连接。Linux操作系统为用户提供了称为BSD Socket的网络编程接口。利用其中的TCP套接口函数,可以非常方便地实现HTTP协议。
HTTP1.0为每一次HTTP请求/响应建立一条新的TCP连接,由于建立一条TCP连接要经历3次握手,因此效率不高。HTTP1.1提出了可持续性连接的概念。HTTP1.1只建立一次TCP连接,而重复地使用它传送一条素的请求/响应消息,减少了额外开销。在嵌入式HTTP服务器中,一般使用HTTP1.1协议。HTTP1.1协议的细节请参考RFC2616。
3.2 通用网关接口CGI
参数设置和远程控制功能都是通过CGI(通用网关接口)程序和表单实现的。CGI使用HTML表单向Web服务器发送信息。基本语法如下:
<FORM METHOD=get/post ACTION=URL></FORM>
其中,METHOD属性指定将数据传送到Web服务器的方法。输入方法有两种:GET和POST。ACTION属性定义要对表单数据进行处理的CGI脚本的URL。
CGI的工作流程是首先由浏览器将用户输入的数据传递给Web服务器,Web服务器根据接收到的数据设置环境变量并启动CGI脚本,CGI脚本从环境变量中读取所需要的数据并进行相应处理,最后使用STDOUT输出HTML形式的结果文件,经Web服务器送回浏览器,最终显示给用户。传统的CGI程序与服务器代码分开,是一个符号CGI标准的可执行文件,并储存在CF卡等存储设备上,一般用脚本语言编写。考虑到嵌入式HTTP服务器要求速度快,功能和代码都尽可能精简的特点,可以把原先由可执行文件完成的功能用C函数实现,放在服务器代码内部,并直接从HTTP请求报文接收数据。与传统CGI程序相比,这种方法具备如下特点:
*不需要标准输入,CGI函数可以直接获取到浏览器送来的信息;
*不需要标准输出,CGI函数可以直接将数据送回给浏览器;
*不需要环境变量,CGI和Web服务器在同一程序中实现,不需要环境变量来交换信息。
3.3 自定义标记
要在网页中显示工控系统中大量的实时数据,常规方法是将HTML代码直接集成到程序代码中,或者反之将C程序代码集成到HTML标记语言中。这两种方法均要求开发人员对HTML标记语言的语法细节非常熟悉。网页或程序结构的单方面调整都将导致整个系统全盘修改,系统不具备灵活性与可扩展性。HTML的精髓在于该语言的“标记”性,各种不同标记的具体含义是由服务器和浏览器进行解析。因此,当现有标记不能满足新的应用需求时,可以自行定义新的标记,只需服务器将自定义标记解析为标准标记,然后传送给浏览器即可。在本项目中,主要的实时数据转速、重量、一氧化碳含量等状态信息,可以定义相应的标记。服务器中解析相应标记的函数同样用C语言来实现。运行时,当客户端发出查看某实时网页的请求后,嵌入式HTTP服务器将相应的网页文件从电子盘加载到内存进行逐项解析。当辨识出自定义标记后,就调用相应的函数。该函数返回该标记对应的当前值,并置换HTML文件流中的自定义标记。最后,嵌入式HTTP服务器将解析结果发送给客户端。实时网页的设计与相应的HTTP服务器处理程序得以分离,处于一种弱耦合关联状态。这样,网页界面的调整不会影响HTTP服务器的程序设计,HTTP服务器程序的修改也与网页界面设计无关,整个嵌入式HTTP服务器具备灵活性和可扩展性。
3.4 多线程
最初的进程定义包含程序、资源及其执行三部分,其中程序通常指代码,资源通常包括 内存资源、I/O资源、信号处理等,而程序的执行指执行上下文,这一部分后来发展为线程。在线程的概念出现以前,为了减小进程切换的开销,操作系统设计者逐渐修改正进程的概念,允许将进程所占有的资源从其主体剥离出来,允许某些进程共离享一部分资源,例如文件、信号、数据内存、甚至代码,这就是轻质进程的概念。Linux内核的2.0.x版本就已经实现了轻质进程。应用程序可以通过一个统一的clone()系统调用接口,用不同的参数指定创建轻质进程还是普通进程。在内核中,clone()调用经过参数传递和解释后会调用do_fork(),这个核内函数同时也是fork、vfork()系统调用的最终实现。在do_fork()中,不同的flone_flags将导致不同的行为。在LinuxThreads中,使用(CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND)参数调用clone()创建“线程”,表示共享内存、共享文件系统、共享文件描述符表,以及共享信号处理方式。Linux操作系统下,已经实现基于轻质进程的符号POSIX1003.C标准的线程库LinuxThreads。
在传统的Unix服务器程序设计中,为了使服务器具备并发处理连接的能力,通常采用父进程处理连接,并调用fork()创建子进程来处理用户请求的方法。这种方法的缺点是进程创建慢,耗费资源,进程切换开销大,进程之间通信比较困难等,不适用对资源、速度有要求的嵌入式系统。因此,在嵌入式HTTP服务器的开发中使用线程的方法。利用LinuxThreads提供的pthread_create()等函数派生出线程,也即轻质进程来处理多个HTTP请求。
4 工作流程和代码设计
4.1工作流程
嵌入式HTTP服务器程序开始运行时,主进程首先创建一个接口,并和主机地址绑定到一起,随后置为被动监听状态,等待客户端连接请求的到来。分别用函数socket()创建一个接口,bind()绑定地址,listen()监听,accept()接收来完成。当建立一个TCP连接后,函数accept()返回一个新的套接口描述符,主进程就创建一个新的子线程(轻质进程)处理这个新的连接。
子线程用于处理每具体的HTTP请求。子线程首先解析用户的HTTP请求。当用户请求一个网页时,子线程查找文件系统。如果该网页文件存在,且通过权限认证,就把它从CF卡读入内存并扫描,发现有自定义标记则调用相应函数进行处理,最后把结果返回给浏览器;否则给一个简单的出错消息。当用户是上传数据时,子线程调用相应函数读取数据进行处理,并返回处理结果给浏览器。
4.2 代码设计
在嵌入式HTTP服务器的代码设计中,考虑到代码的移植性和扩展性,利用C语言实现了面向对象风格的代码结构。代码主要由两上数据结构request_inf和response_inf以及其上一组操作函数组成。
结构request_inf和response_inf分别用来保存HTTP请求报文和响应报文的所有信息。在结构定义时,应根据具体应用特点设计结构包含的成分。
嵌入式HTTP服务器的函数包括通用函数、CGI函数和自定义标记处理函数等,其中通用函数是一些与HTTP1.1协议有关的函数。
(1)通用函数
*void prase_request_line(char *,struct *request_inf)
该函数用来解析HTTP请求报文的请求行(Request_Line),并把相应信息存放在结构request_inf中。其中,对请求行中URI部分的解析包括两种情况。如果用户请求一个网页,则获取文件路径、文件类型;如果用户要求上传数据,则把数据放在一个字符数组中。然后将文件路径和类型,或者指向该数组的指针、方法、版本号信息都放入结构request_inf中。
*void prease_general_header(char*,struct*request_inf)
该函数用来解析HTTP请求报文的调用首部(General_Header)。之所以把此函数与函数prase_request_line()分开,是考虑到程序的修植性和扩展性。请求行和通用首部是请求报文中的不同部分,不不同的场合下,要求解析的信息可能存在差导师。同时,这样也能使程序结构更清楚。比如,本项目要从通用首部解析字段Keep_Alive。该字段指明一个最长的时间或最大请求数目,在此范围内可以保持TCP连接不被释放(即前文提到的HTTP1.1的持续连接特性,persistent connection)。
*void prase_request_header(char*,struct*request_inf)
void prase_entity_header(char*,struct*request_inf)
HTTP请求报文的请求头部用来说明浏览器的一些信息,实体头部则用来说明请求报文中可能存在的实体主体信息。本项目实际上并不需要使用这两个函数来获取相关信息,但考虑到程序的扩展性和移植性,此处仍然把它列出来,它们是两个空函数。
*send_status_line(int fd,struct *response_inf)
此函数用来产生一个HTTP响应报文的状态行(Status_line)。状态行包括三部分内容,即HTTP版本、状态码以及解释状态码的简单短语。这些信息预先放在结构response_inf中。
*send_general_header(int fd,struct*response_inf)
send_response_header(int fd,struct*response_inf)
send_entity_header(int fd,struct*response_inf)
这三个函数分别用来产生HTTP响应报文的通用首部、响应首部(Response_header)和实体首部。嵌入式HTTP服务器是一个瘦服务器,功能非常简单。因此HTTP响应报文的通用首部、响应首部和实体首部中的可选字段许多是不需要的,还有许多是固定不变的,例如Last_modified和Content_type字段。Last_modified字段指出资源上次被修改的时间并由接收方解释。如果接收方已有此资源的拷贝,但此拷贝比Last-Modified域所指定的要旧,那该拷贝就是过期的。由于网页文件中含有自定义标记,具有实时性,所以此字段根本没有含有Content_type字段指出实体的媒体类型,本项目中的嵌入式HTTP服务器被设计成只支持HTML类型,因此该字段的内容总是Content_type=text/html。有关服务器和资源的所有标题域信息都被放入结构response_inf中。
*send_white_line(int fd)
http协议范文6
关键词:B/S;信息推送;Websocket
引言
随着Web 2.0时代的到来,B/S(Browser/Server)构架的应用越来越广泛。在B/S构架的应用中,浏览器与服务器之间的通信采用HTTP(HyperText Transfer Protocol,超文本传输协议)协议。而HTTP协议中,所有的通信都必须由浏览器发起,服务器进行响应,这就是“请求-回复(Request-Response)”模式。因此,在B/S构架的应用中,服务器无法自主的向浏览器发送信息。但随着B/S应用越来越复杂,功能越来越多,客户所期望的用户体验越来越好,越来越多的B/S应用希望服务器能自主的向浏览器发送信息,甚至期望达到浏览器与服务器之间实时的双向通信。这就需要B/S构架中能够实现信息的推送(Web Push)。
1 传统的信息推送方式
传统的B/S构架中,由于HTTP协议的限制,服务器不能主动发起通信,因此要实现类似于服务器推送信息的效果只能采用一些变通的方法。传统的信息推送一般采取如下几种方式实现:定期轮询(Periodic Polling)、长轮询(Long Polling)和流(Streaming)。
1.1 定期轮询
由浏览器每隔一段时间主动向服务器发送一次请求,然后根据服务器的返回数据来获得获得服务器希望推送给浏览器的信息。这种方式下,轮询的时间间隔比较难控制,时间间隔太长,浏览器不能及时的获得服务器需要推送的信息,信息交流不及时,用户体验变差;而如果时间间隔太短,则浏览器将频繁的与服务器进行数据通信,导致服务器负载增大。特别是当服务器无需推送信息的时候,浏览器仍旧会定期的与服务器进行通信,从而浪费大量的网络带宽和资源。
1.2 长轮询
当浏览器向服务器发送请求后,如果服务器有信息需要推送,则立刻回应这个请求,否则,先保持这个连接一段时间,直到服务器有数据需要推送或者连接时间过期为止;浏览器在收到服务器的回应后,将立刻向服务器再次发出新的请求,并等待服务器的回应。这种方式可以减少浏览器与服务器之间的无效通信,从而提高效率,减少系统负担。但当服务器更新频繁时,也就和定期轮询之间没有本质的差别了。
1.3 流
浏览器通过一个隐藏的窗口(比如iframe)向服务器发出一个长连接的请求,服务器接收到这个请求后,做出回应并不断更新连接状态,从而保证服务器与浏览器之间的连接不过期,进而实现服务器将信息推送给浏览器的功能。这种方式在并发数较大的情况下,服务器将会消耗大量的系统资源。
1.4 传统推送方式的不足
虽然上述几种方法均能在传统的B/S构架中实现,但这这些方法很明显的存在着一些弊端:1、定期轮询可能会导致较高的延时,服务器信息不能实时的被推送到浏览器;2、长轮询或流需要使用到一些特定的编程模型或方案,如Comet;3、会带来许多扩展性问题;4、较高的带宽成本和系统资源开销;5、对跨域环境的支持比较有限。
2 基于Websocket协议的信息推送方式
Websocket协议是HTML5提供的一种浏览器与服务器之间进行双向通信的技术。通信双方在完成一次简单的握手操作之后,就建立起一条快速通道,然后利用这个通道可以进行双向通信,自然也就可以实现信息的推送。
2.1 Websocket协议简介
Websocket协议是独立的基于TCP的协议,与HTTP协议之间唯一的联系仅是在浏览器与服务器的握手阶段。
2.1.1 浏览器发出握手请求
首先浏览器以标准的HTTP Get方式向服务器发出握手请求,在请求的头信息中加入了Websocket协议所需要的一些信息。示例如下:
GET /WSHandler.ashx HTTP/1.1
Connection:Upgrade
Host:localhost:1550
Origin:http://localhost:1550
Sec-WebSocket-Key:A3IIMlEc9ARZWlO9ShrePw==
Sec-WebSocket-Version:13
Upgrade:websocket
2.1.2 服务器响应握手请求
服务器在获得这些头信息后,经过处理,以HTTP方式进行回复,回复时也在头信息的部分加入了Websocket协议所需要的信息。示例如下:
HTTP/1.1 101 Switching Protocols
Upgrade: Websocket
Sec-WebSocket-Accept: lJYdhpEDwO4BMgu0meIY94nJIYs=
Connection: Upgrade
经过这样的一个握手过程之后,浏览器与服务器之间就建立起了一条TCP通道。
2.1.3 数据帧
在Websocket协议中,数据使用一系列的帧来传输。基本帧协议定义了带有操作码(opcode)的帧类型、负载长度、和用于“扩展数据”与“应用数据”及它们一起定义的“负载数据”的指定位置。由于采用了帧,Websocket协议不需要像HTTP协议那样发送大量的头信息,从而大大降低了对网络带宽的要求。
2.1.4 Websocket URIs
Websocket协议定义了两种URI,分别是普通的ws-URI和安全的wss-URI。这两种URI均遵循ABNF语法格式,和普通的HTTP协议的URI非常相似。其格式如下:
ws-URI:ws://host[:port]/path[?query]
wss-URI:wss://host[:port]/path[?query]
其中ws-URI的默认端口为80,wss-URI的默认端口为443。
2.2 Websocket协议的优势
相对与传统的信息推送方式,Websocket协议有着诸多的优点:1、支持SSL,安全性高;2、整体性能高,无论是服务器的负载还是网络带宽的成本都大大降低;3、默认采用80或443端口进行数据传输,一般不会被封堵;4、可以支持跨域连接;5、在W3C中定义了Javascript API,客户端编程更加方便。
2.3 Websocket协议存在的问题
当然,Websocket协议也存在一些问题:1、Websocket协议的标准化进程尚未完成,API可能会发生变化,开发应用尚存在一些风险;2、目前仅部分浏览器支持Websocket协议,如IE10之前的IE浏览器均不支持;3、也不是所有的服务器软件都支持Websocket,比如.NET 4.5开始支持Websocket协议,但必须运行在Windows 8或Windows Server 2012平台上才行。
2.4 Websocket在应用中的解决方案
结合Websocket协议的优缺点,我们可以在设计B/S构架的应用时,将实时部分功能和非实时部分功能进行分离,实时性要求强的功能使用Websocket协议实现,而其他功能仍旧使用传统的HTTP协议实现。这样的两种方式能在互不干扰的情况下,发挥出各自的优势,合理利用资源。同时也更便于升级现有的B/S系统,降低成本,提高效率,优化用户体验。
3 Websocket协议在B/S应用中的具体实现
在某订单处理流程中,用户希望浏览器能实时反映出订单状态的变化。原有系统此部分的功能采用基于iframe的流方式实现,虽然基本达到了实时反应订单状态变化的需求,但系统开销很大。因此尝试使用Websocket协议来进行优化。
3.1 服务器的实现
服务器运行平台为Windows Server 2012,安装有.NET 4.5和Microsoft Websockets。在中通过增加一个自定义的HTTP Handler就可以接受浏览器发出的Websocket连接请求并实现与浏览器进行通信。
public class WSHandler : IhttpHandler, IReadOnlySessionState {
public void ProcessRequest(HttpContext context) {
if (context.IsWebSocketRequest) {
context.AcceptWebSocketRequest(new WSOrderHandler());
}
}
}
public class WSOrderHandler : WebSocketHandler {
private static WebSocketCollection m_sessions = new WebSocketCollection();
private string m_username;
public WSOrderHandler() { m_username = ...; }
public override void OnOpen() { m_sessions.Add(this); }
public override void OnMessage(string message) { ... }
public override void OnClose() { m_sessions.Remove(this); }
}
服务器如果需要向所有浏览器发送广播消息,可以通过WSOrderHandler对象中的静态成员m_sessions的Broadcast()方法来实现;服务器如果只需向指定浏览器发送消息,则需先在m_sessions中找到符合要求的session,然后调用Send()方法。
3.2 浏览器的实现
浏览器直接使用W3C所规定的Websocket Javascript API进行开发。首先创建一个Websocket连接。
var wbConnect = new WebSocket('ws://.../WSHandler.ashx');
然后定义onopen、onclose、onmessage、onerror等事件处理函数。
wbConnect.onopen = function (evt) { ... };
wbConnect.onclose = function (evt) { ... };
wbConnect.onmessage = function (evt) { ... };
wbConnect.onerror = function (evt) { ... };
最后,如果浏览器需要发送消息给服务器,则可以通过调用wbConnect.Send()方法实现。
3.3 最终效果
基于以上过程,整个改动涉及的代码量并不多,完全不影响原有系统的其他功能。且在实际运行后,在用户体验不变的情况下,服务器的资源消耗情况大幅改善,取得预期的效果。
4 结束语
Websocket协议虽然尚处在不断完善的阶段,但其在实时应用中的巨大优势已经展露无遗。即使是普通的B/S应用,也能通过使用Websocket协议达到降低系统负载、减少网络成本、优化用户体验的作用。相信随着Websocket协议的进一步完善,将会有越来越多的浏览器和服务器支持Websocket协议,也将会有更多的B/S应用采用Websocket协议。
参考文献
[1] IETF. The WebSocket Protocol[S/OL]. http:///html/rfc6455.
[2] Paul Batum,Stefan Schackow. Building real-time web apps with WebSockets using IIS, and WCF[R/OL]. http:///events/BUILD/BUILD2011/SAC-807T.
[3] 秦久明. Web服务推送技术的研究与实现[J]. 福建电脑,2012,12:65-66+53.