Java 高层网络编程.docx
- 文档编号:11093758
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:15
- 大小:25.50KB
Java 高层网络编程.docx
《Java 高层网络编程.docx》由会员分享,可在线阅读,更多相关《Java 高层网络编程.docx(15页珍藏版)》请在冰豆网上搜索。
Java高层网络编程
Java高层网络编程
QusayH.Mahmoud著2002-11-14
边城狂人译2002-12-10
基于HTTP的应用程序
J包中的类和接口提供了可用于低层和高层网络编程的API。
低层API可以让你直接访问网络协议,但是为此你不得不使用低层的TCP套接字和UDP数据包。
高层的API(如URL,URLConnection和httpURLConnection等类)可以使你更快的开发网络应用,却不需要写很多代码。
另一篇文章,JProgrammingwithJ2SE1.4》会告诉你如何使用低层的套接字进行网络编程。
这篇文章的重点则放在如何使用J包中的高层API开发基于HTTP的应用程序。
这篇文章将有如下内容:
∙概览HTTP
∙概览J包的高层API
∙示例说明如何使用高层API
∙制作一个可以下载股票行情的应用程序
∙演示如何提交数据到网页服务器
∙概览HTTP的验证并展示如何保护你的网络资源
∙提供代码实例演示如何执行HTTP的验证
概览HTTP
超文本传输协议(HypertextTransferProtocol,HTTP)是一个“请求-回应”的应用协议。
这个协议支持一套固定的方法如GET、POST、PUT、DELETE等。
一般用GET方法向服务器请求资源。
这里有两个GET请求的例子:
GET/HTTP/1.1
GET/names.htmlHTTP/1.1
另外,你可以使用GET和POST方法向服务器发送数据,它们向服务器发送数据的方式是不同的:
∙GET方法:
输入的数据将作为URL的一部分发送
∙POST方法:
输入数据作为一个独立的实体发送
考虑一下下面的HTML表单:
//www.Jmethod="GET"> Student#: 这个表单会提交到http: //www.J由Servlet处理。 该表单使用了GET方法来传输信息。 如果用户输入一个学号——比如556677——并点击GetMarks按钮,表单数据就会作为URL的一部分传送到Servlet中。 经过编码之后的URL就是: http: //www.J 在使用POST方法的情况下,传输数据时不会将数据作为URL的一部分;它们会作为一个独立的实体来传输。 因此,POST方法更安全,你也可以用这个方法传输更多的数据。 而且用POST传输的数据不一定要是文本,用GET方法传输的却一定要是文本。 消息息格式 请求消息指定了方法名称(GET或者POST)、URL、协议版本号、头部消息和可选消息。 头部消息也许会包含请求信息和客户端信息,如接受的内容类型、浏览器名称以及验证数据。 返回消息指定了协议版本、响应代码和原因。 不管执行是否成功,响应代码和原因都会报告。 一些响应代码如下: 200OK: Requestsucceeded.Therequestedresourcecanbefoundlaterinthismessage. 301MovedPermanently: Requestedresourcehasmoved.Newlocationisspecifiedlaterinthismessage. 400BadRequest: Requestmessageisnotunderstoodbytheserver. 404NotFound: Requesteddocumentisnotfoundonthisserver. 关于HTTP和所有返回代码的信息可以在HTTP1.1规范RFC2616中找到。 下面是一个请求消息由浏览器到服务器的例子。 这里请求的URL是http: //J: GET/HTTP/1.1 Accept: image/gif,image/x-xbitmap,image/jpeg,image/pjpeg, application/vnd.ms-powerpoint,application/vnd.ms-excel, application/msword,*/* Accept-Language: en-ca Accept-Encoding: gzip,deflate User-Agent: Mozilla/4.0(compatible;MSIE5.01;Windows98;YComp5.0.0.0) Host: J Connection: Keep-Alive Cookie: SUN_ID=24.80.19.177: 28346100732290; SunONEUserId=24.80.19.177: 86521021960770 然后这里是服务器对这个请求的回复消息: HTTP/1.1200OK Server: Netscape-Enterprise/6.0 Date: Mon,14Oct200215: 18: 04GMT Content-type: text/html Connection: close 概览J包的高层API J包中含有高层API。 它们实现了一些最常用的基于TCP的协议,如HTTP和FTP等。 其中两个主要的类是URL和URLConnection。 另一个有用的类是HttpURLConnection,它是URLConnection的子类,支持HTTP的特性。 URL(UniformResourceLocator,统一资源定位器)是一个描述Internet中文档(或者其它常见的资源)位置的地址。 URL的样子就像这样: protocol: //machineName: port/resource 注意URL类不是基于HTTP的,这一点非常重要。 它支持FTP、HTTPS和FILE协议。 所以,对于URL类来说,下面所有URL都是有效的。 http: //J http: //localhost: 8080/myApplication ftp: // ftp: // file: ///C: /j2sdk1.4/docs/api/index.html 你在浏览器里输入一个URL的时候,浏览器产生一个HTTPGET(或者POST)命令寻找(或者查询)URL请求的资源。 如果没有指定要查询的的资源,被查询的就会是默认文档(通常是index.html)。 读取URL的内容 让我们以一个简单的应用程序开始,它将会直接从URL读取内容。 不妨先尝试一下使用低层的套接字来读取,请看示例代码1。 在这个例子中,用户在命令行输入资源的URL,然后在80端口(默认的HTTP服务器端口号)打开一个套接字并建立相应的输入输出流。 输出流用来向HTTP服务器发送HTTP命令(比如GET),输入流则用来读取HTTP服务器的返馈。 注意,在这个例子中,服务器回应的头信息也会被读入(这是URL内容之外的东西)。 示例代码1: ReadURL1.Java importJ.*;importJava.io.*;publicclassReadURL1{publicstaticvoidmain(Stringargv[])throwsException{finalintHTTP_PORT=80;if(argv.length! =1){System.out.println("Usage: JavaReadURL1 =null){sb.append(line);}out.close();in.close();System.out.println(sb.toString());}}//endcode 你运行这个例子的时候请注意,URL必须是一个域名如J或者IP地址。 不能加上http: //作为URL的一部分。 如果你要解决这个问题,你就得解析输入的内容并找出它使用什么协议,端口号和要请求什么资源。 你也可以使用URL类,它提供了一些非常有用的方法,如getProtocal、getPort、getHost和getFile等。 使用URL类 要从URL读取内容,可以用URL类非常容易的实现,就像示例代码2所展示的那样。 这使得直接从URL读取内容变得简单。 用这种方法读取的内容不包含服务器回应的头信息,所以不需要你去解析它们了。 运行这个例子时要输入有效的URL,就像protocol: //domainName: port/resource这样。 URL类会解析输入的URL并处理低层的麻烦的工作。 示例代码2: ReadURL2.Java importJ.*;importJava.io.*;publicclassReadURL2{publicstaticvoidmain(Stringargv[])throwsException{if(argv.length! =1){System.out.println("Usage: JavaReadURL2 =null){sb.append(line);}in.close();System.out.println(sb.toString());}} 在你运行ReadURL2的时候,你会看到你输入的URL所请求的文档内容命令窗口中显示出来。 如果你想做除了读取之外的其它事情,请使用openConnection来建立到URL的连接。 这个方法返回一个URLConnection对象,你可以用这个对象来与URL通信,如读、写、查询等。 一但openConnetion方法创建了连接,你就可以使用getContentType、getContentLength、getContentEncoding等非常有用的方法了。 使用URLConnection类 我们现在要创建一个从获取股票信息的应用程序来演示如何使用URLConnection。 为了获取特别的股票信息,用户输入股票标号(比如SUNW、IBM或者MOT),由应用程序从YahooQuote服务器获取相应的股票信息。 应用程序会显示出该股票的名称、价格和日期。 有两种方法(可以用在这个应用程序中的)用来从YahooQuote服务器获取股票信息。 第一种方法的格式如下: 如果你在浏览器的地址栏输入这个URL,你将会看到像图1所示的那些内容。 图1: 获取股票行情 另一种方法的格式是: 图2: 获取股票行情的另一种方法 你可以看到第一种方法的结果是一行文本,解析时会比第二种容易许多,也快许多,因为第二种方法的结果含有大量的文字,包括许多广告和格式化信息。 所以我用第一种方法实现这个关于股票的应用程序,它由两个类组成: Stock.Java和StockReader.Java。 Stock.Java类 这个类将从YahooQuote服务器获得的字符串解析成字段(例如股票名称、价格和日期)。 示例代码3中展示了一个实现的例子。 示例代码4中的StockReader类会用到这个工具类。 示例代码3: Stock.Java publicclassStock{privatestaticStringname,time,price;//Givenaquotefromtheserver,//retrievethename,price,anddateofthestockpublicstaticvoidparse(Stringdata){intindex=data.indexOf('"');name=data.substring(++index,(index=data.indexOf('"',index)));index+=3;time=data.substring(index,(index=data.indexOf('-',index))-1);index+=5;price=data.substring(index,(index=data.indexOf('>',index)));}//GetthenameofthestockfrompublicstaticStringgetName(Stringrecord){parse(record);return(name);}//GetthepriceofthestockfrompublicstaticStringgetPrice(Stringrecord){parse(record);return(price);}//GetthedateofthestockpublicstaticStringgetDate(Stringrecord){parse(record);;returntime;}} StockReader.Java类 这个类的任务是连接到YahooQuote服务器,并从服务器上获取股票行情。 它使用Stock类解析从服务器返回的字符串。 示例代码4是它的一个实现。 示例代码4: StockReader.Java importJava.io.*;importJ.*;publicclassStockReader{publicstaticvoidmain(Stringargv[])throwsException{StringquoteFormat="&f=slc1wop";if(argv.length! =1){System.err.println("Usage: JavaStockReader (1);}URLurl=newURL("URLConnectionconnection=url.openConnection();connection.setDoOutput(true);PrintWriterout=newPrintWriter(connection.getOutputStream());out.println("s="+argv[0]+quoteFormat);out.close();BufferedReaderin=newBufferedReader(newInputStreamReader(connection.getInputStream()));Stringline=in.readLine();/*DEBUGwhile((line=in.readLine())! =null){System.out.println("Got: "+line);}*/in.close();System.out.println("Name: "+Stock.getName(line));System.out.println("Price: "+Stock.getPrice(line));System.out.println("Date: "+Stock.getDate(line));}} 将数据提交到网页服务器 在上面的例子中,数据是作为URL的一部分被送到服务器的,使用的GET方法。 现在来看一个使用POST方法发送数据的例子。 这个例子中,http: //www.J中的CGI脚本(名为.cgi)需要name和email值。 如果用户提交SallyMcDonald作为name值,smc@作为email值,CGI脚本会获取输入并对消息进行解析、解码,再将提交的内容返回给客户端。 这个CGI脚本做事情并不多,但我们要用它来演示如何向服务器提交数据。 还有一点非常重要——请注意使用POST方法时,消息内容的类型是application/x-www-form-urlencoded,这种类型会: ∙指定常规数据编码 ∙将空格转换为加号(+) ∙将非文本内容转换成十六进制数后接百分号(%)的形式 ∙在每个name=value对之间放置&符号 根据这个编码规则,消息(name=SallyMcDonaldandemail=smc@)在发送给CGI脚本之前必须被编码成: name=Sally+McDonald&email=smc@ CGI脚本收到这个已编码的消息后会对它进行解码。 不过非常幸运,你不必为手工进行编码操作。 你可以使用J.URLEncoder类来对消息进行编码,就像下面的例子中那样。 相应地你可以使用J.URLDecoder来对消息进行解码。 示例代码5中是这个例子的实现(使用HttpURLConnection类),它展示了如何使用POST方法向服务器发送数据。 你会看到: ∙为CGI脚本打开连接和I/O流 ∙设置请求方法为POST ∙使用URLEncoder.encode方法对消息进行编码(URLDecoder.decode方法可以用于解码) ∙向CGI脚本发送已经编码的消息 ∙接收服务器返回的消息并在控制台打印出来 示例代码5: PostExample.Java importJava.io.*;importJ.*;publicclassPostExample{publicstaticvoidmain(String[]argv)throwsException{URLurl=newURL("http: //www.JHttpURLConnectionconnection=(HttpURLConnection)url.openConnection();connection.setRequestMethod("POST");connection.setDoOutput(true);PrintWriterout=newPrintWriter(connection.getOutputStream());//encodethemessageStringname="name="+URLEncoder.encode("QusayMahmoud","UTF-8");Stringemail="email="+URLEncoder.encode("qmahmoud@J","UTF-8");//sendtheencodedmessageout.println(name+"&"+email);out.close();BufferedReaderin=newBufferedReader(newInputStreamReader(connection.getInputStream()));Stringline;while((line=in.readLine())! =null){System.out.println(line);}in.close();}} 代理服务器和防火墙 如果你使用了防火墙,你就得把代理服务器以及端口号的详细信息告诉Java,这样才能访问到防火墙外的主机。 你可以通过定义一些HTTP或者FTP属性来做到: http.proxyHost(default: ) http.proxyPort(default: 80ifhttp.proxyHostspecified) http.no
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 高层网络编程 高层 网络 编程