用Socket类实现HTTP协议客户端应用-_第1页
用Socket类实现HTTP协议客户端应用-_第2页
用Socket类实现HTTP协议客户端应用-_第3页
用Socket类实现HTTP协议客户端应用-_第4页
用Socket类实现HTTP协议客户端应用-_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用Socket类实现HTTP协议客户端应用Http客户端程序已集成在Java语言中,可以通过URLConnection类调用。遗憾的是,由于SUN没有公布Http客户程序的源码,它实现的细节仍是一个谜。本文根据HTTP协议规范,用J.Socket类实现一个HTTP协议客户端程序。1.Socket类:了解TCP/IP协议集通信的读者知道,协议间的通信是通过Socket完成的。在J包中,Socket类就是对Socket的具体实现。它通过连接到主机后,返回一个I/O流,实现协议间的信息交换。2 . HTTP协议HTTP协议同其它TCP/IP协议集中的协议一样,是遵循客户/服务器模型工作的。客户端发往

2、服务端的信息格式如下:-请求方法URL HTTP协议的版本号提交的元信息*空行*实体-请求方法是对这次连接工作的说明,目前HTTP协议已经发展到1.1版,它包括GET、HEAD、POST、DELETE、OPTIONS、TRACE、PUT七种。元信息是关于当前请求的信息。通过分析元信息,可以检查实体数据是否完整,接收过程是否出错,类型是否匹配等。元信息的引入使HTTP协议通信更加稳妥可靠。实体是请求的具体内容。将上述报文发往Web服务器,如果成功,应答格式如下:-HTTP协议的版本号应答状态码应答状态码说明接收的元信息*空行*实体-以上报文发向客户端,并且接收成功,彼此间关闭连接,完成一次握手。

3、下面用最常用的GET方法,来说明具体的报文应用-GET HTTP/1.0accept: www/source; text/html; image/gif; image/jpeg; */*User_Agent: myAgent*空行*-这个报文是向主机请求一个缺省HTML文档。客户端HTTP协议版本号是1.0版,元信息包括可接收的文件格式,用户代理,每一段之间用回车换行符分隔,最后以一个空行结束。发向服务器后,如果执行过程正常,服务器返回以下代码:-HTTP/1.1 200 OKDate: Tue, 14 Sep 1999 02:19:57 GMTServer: Apache/1.2.6Conn

4、ection: closeContent-Type: text/html*空行*.-HTTP/1.1表示这个HTTP服务器是1.1版,200是服务器对客户请求的应答状态码,OK 是对应答状态码的解释,之后是这个文档的元信息和文档正文。(相关应答状态码和元信息的解释请参阅Inetrnet标准草案:RFC2616。3. HTTP客户端程序:import .*;import java.io.*;import java.util.Properties;import java.util.Enumeration;public class Http protected Socket client;prote

5、cted BufferedOutputStream sender;protected BufferedInputStream receiver;protected ByteArrayInputStream byteStream;protected URL target;private int responseCode=-1;private String responseMessage=;private String serverVersion=;private Properties header = new Properties(;public Http( public Http(String

6、 url GET(url ;/* GET方法根据URL,会请求文件、数据库查询结果、程序运行结果等多种内容*/ public void GET(String url try checkHTTP(url;openServer(target.getHost(,target.getPort( ;String cmd = GET + getURLFormat(target + HTTP/1.0rn+ getBaseHeads(+rn;sendMessage(cmd;receiveMessage(;catch(ProtocolException p p.printStackTrace(;return;c

7、atch(UnknownHostException e e.printStackTrace(;return;catch(IOException ii.printStackTrace(;return;/* HEAD方法只请求URL的元信息,不包括URL本身。若怀疑本机和服务器上的* 文件相同,用这个方法检查最快捷有效。*/public void HEAD(String url try checkHTTP(url;openServer(target.getHost(,target.getPort( ;String cmd = HEAD +getURLFormat(target+ HTTP/1.0r

8、n+getBaseHeads(+rn;sendMessage(cmd;receiveMessage(;catch(ProtocolException p p.printStackTrace(;return;catch(UnknownHostException e e.printStackTrace(;return;catch(IOException ii.printStackTrace(;return;/* POST方法是向服务器传送数据,以便服务器做出相应的处理。例如网页上常用的* 提交表格。*/public void POST(String url,String content try c

9、heckHTTP(url;openServer(target.getHost(,target.getPort( ;String cmd = POST + getURLFormat(target +HTTP/1.0rn+getBaseHeads(;cmd += Content-type: application/x-www-form-urlencodedrn;cmd += Content-length: + content.length( + rnrn;cmd += content+rn;sendMessage(cmd;receiveMessage(;catch(ProtocolExceptio

10、n p p.printStackTrace(;return;catch(UnknownHostException e e.printStackTrace(;return;catch(IOException ii.printStackTrace(;return;protected void checkHTTP(String url throws ProtocolException try URL target = new URL(url;if(target=null | !target.getProtocol(.toUpperCase(.equals(HTTP throw new Protoco

11、lException(这不是HTTP协议;this.target = target;catch(MalformedURLException m throw new ProtocolException(协议格式错误;/* 与Web服务器连接。若找不到Web服务器,InetAddress会引发UnknownHostException * 异常。若Socket连接失败,会引发IOException异常。*/protected void openServer(String host,int port throws UnknownHostException,IOException header.clea

12、r(;responseMessage=; responseCode=-1;try if(client!=null closeServer(;if(byteStream != null byteStream.close(; byteStream=null;InetAddress address = InetAddress.getByName(host;client = new Socket(address,port=-1?80:port;sender = new BufferedOutputStream(client.getOutputStream(;receiver = new Buffere

13、dInputStream(client.getInputStream(;catch(UnknownHostException u throw u;catch(IOException i throw i;/* 关闭与Web服务器的连接*/protected void closeServer( throws IOException if(client=null return;try client.close(; sender.close(; receiver.close(;catch(IOException i throw i;client=null; sender=null; receiver=

14、null;protected String getURLFormat(URL target String spec = http:/+target.getHost(;if(target.getPort(!=-1spec+=:+target.getPort(;return spec+=target.getFile(;/* 向Web服务器传送数据*/protected void sendMessage(String data throws IOException sender.write(data.getBytes(,0,data.length(;sender.flush(;/* 接收来自Web服

15、务器的数据*/protected void receiveMessage( throws IOExceptionbyte data = new byte1024;int count=0;int word=-1;/ 解析第一行while( (word=receiver.read(!=-1 if(word=r|word=n word=receiver.read(;if(word=n word=receiver.read(;break;if(count = data.length data = addCapacity(data;datacount+=(byteword;String message

16、= new String(data,0,count;int mark = message.indexOf(32;serverVersion = message.substring(0,mark; while( mark responseCode = Integer.parseInt(message.substring(mark+1,mark+=4; responseMessage = message.substring(mark,message.length(.trim(; / 应答状态码和处理请读者添加 switch(responseCode case 400: throw new IOEx

17、ception(错误请求; case 404: throw new FileNotFoundException( getURLFormat(target ; case 503: throw new IOException(服务器不可用 ; if(word=-1 throw new ProtocolException(信息接收异常终止; int symbol=-1; count=0; / 解析元信息 while( word!=r & word!=n & word-1 if(word=t word=32; if(count=data.length data = addCapacity(data;

18、datacount+ = (byteword; parseLine: while( (symbol=receiver.read( -1 switch(symbol case t: symbol=32; break; case r: case n: word = receiver.read(; if( symbol=r & word=n word=receiver.read(; if(word=r word=receiver.read(; if( word=r | word=n | word32 break parseLine; symbol=32; break; if(count=data.l

19、ength data = addCapacity(data; datacount+ = (bytesymbol; word=-1; message = new String(data,0,count; mark = message.indexOf(:; String key = null; if(mark0 key = message.substring(0,mark; mark+; while( mark0 byteStream = new ByteArrayInputStream(data,0,count; data=null; closeServer(; public String getResponseMessage( return responseMessage; public int getResponseCode( return responseCode; public String getServerVersion( return serverVersion; public InputStrea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论