【文档说明】《Java基本网络类》课件.ppt,共(38)页,390.361 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-45111.html
以下为本文档部分文字说明:
AdvancedNetworkProgrammingRenJiansirenjsv@cug.edu.cnNetworkingBasics•ApplicationsLayer–Standardapps•HTTP•FTP•T
elnet–Userapps•TransportLayer–TCP–UDP–ProgrammingInterface:•Sockets•NetworkLayer–IP•LinkLayer–Devicedrivers•TCP/IPStackApplication(http,ftp
,telnet,…)Transport(TCP,UDP,..)Network(IP,..)Link(devicedriver,..)NetworkingBasics•TCP(TransportControlProtocol)isaconnection-oriented
protocolthatprovidesareliableflowofdatabetweentwocomputers.•Exampleapplications:–HTTP–FTP–Telnet•TCP/IPStackApplication(http,ftp,teln
et,…)Transport(TCP,UDP,..)Network(IP,..)Link(devicedriver,..)NetworkingBasics•UDP(UserDatagramProtocol)isaprotocolthatsendsind
ependentpacketsofdata,calleddatagrams,fromonecomputertoanotherwithnoguaranteesaboutarrival.•Exampleapplications:–Clocks
erver–Ping•TCP/IPStackApplication(http,ftp,telnet,…)Transport(TCP,UDP,..)Network(IP,..)Link(devicedriver,..)Java基本网络类本章介绍了Java基本的网络类
(InetAddress、URL、URLConnection和Socket)的使用,介绍如何利用Socket通信机制实现客户/服务器方式的一对一的通信,实现浏览器/服务器方式的网络聊天。1Java网络进程通信
概述网络编程一般指利用不同层次的通信协议提供的接口实现网络进程安全通信和应用的编程。网络进程就是网点机(连入网络的计算机)上运行的程序。网络进程在通信协议中用端口标识(port),它驻留的网点机用其IP地址或域名来标识。网络进程同步通信是指通信的发起者向接收者发出服
务请求后,必须得到对方回应,才继续运行。如果通信的发起者向接收者发出服务请求后,可以继续运行,需要时再获取接收者的响应,这叫异步通信。网络协议工程就是利用软件工程的方法(分层次、分模块等技术)来解决复杂网络进程通信的问题。网络进程往往按照应用的需要,采用不同层次的协议进行通信
。2Java网络基本类2.1InetAddress类InetAddress类用来描述Internet地址。1.获取本机的IP地址例1用InetAddress类获取本机的IP地址。importjava.net.*;importjava.io.*;pu
blicclassGetLocalHost{publicstaticvoidmain(String[]arg){InetAddressmyIp=null;try{myIp=InetAddress.getLoc
alHost();}catch(UnknownHostExceptione){}System.out.println(myIp);}}2.根据域名获得IP地址例2根据域名自动到DNS上查找IP地址。importjava.net.*;importjava.io.*;publicclassGetI
P{publicstaticvoidmain(Stringargs[]){InetAddresscug=null;try{cug=InetAddress.getByName("www.cug.edu.cn");}catch(UnknownHostExceptione){}Sy
stem.out.println(cug);}}getByName()publicstaticInetAddressgetByName(Stringhost)throwsUnknownHostExceptionInetAddressutopia,duke;try{uto
pia=InetAddress.getByName("utoa.poly.edu");duke=InetAddress.getByName("118.218.2.92");}catch(UnknownHostExceptione){System.err.println(e);}2.2UR
L类URL(UniformResourceLocator)是WWW资源统一资源定位器的简写,它规范了WWW资源网络定位地址的表示方法。WWW资源包括Web页、文本文件、图形文件、声频片段等。1.URL类简
介URL类定义了WWW资源的特征及读其内容的方法。其基本表示格式:protocol://hostname:/resourcename#anchor其中,protocol:使用的协议,它可以是http,ftp,news,telnet等
;hostname:主机名,指定域名服务器(DNS)能访问到的WWW服务的计算机,如:www.sun.com;port:端口号,是可选的,表示所连的端口号,如默认,将连接到协议默认的端口。resourcename:资源名,是
主机上能访问到的目录或文件;anchor:标记,也是可选的,它指定文件内的有特定标记的位置。URL例子:(1)http://www.ncsa.uiuc.edu/demoweb/url-primer.htm(2)http://ww
w.ncsa.uiuc.edu:8080/demoweb/url-primer.htm(3)ftp://local/demo/information#myinfo(4)file://local/demo/readme.txt第
(2)个URL把标准Web服务器端口80指定为8080端口,第(3)个URL加上符号“#”,用于指定在文件information中标记为myinfo的部分。2.URL类对象URL类的构造方法有如下四种。(1)URL
(URLabsoluteURL)例:URLmyUni=URL(“http://www.cug.edu.cn/”)(2)URL(URLurl,StringrelativeURL)例:URLmyUni=URL(“http://www.cug.ed
u.cn/”);URLmydoc=URL(myUni,”mydoc.html”)(3)URL(Stringprotocol,Stringhost,Stringresourcename)例:URLmyUni=URL(“http”,”www.cu
g.edu.cn”,”/mydoc.html”);等价于:URLmyUni=URL(“http://www.cug.edu.cn/mydoc.html”);(4)URL(Stringprotocol,Stringhost,intpo
rt,Stringresourcename)例:URLmyUni=URL(“http”,”www.cug.edu.cn”,80,”/mydoc.html”);等价于:URLmyUni=URL(“http://www.cug.edu.cn:80/mydoc.html”);3.URL类获取其特征的主
要方法StringgetProtocol();返回URL的协议名。StringgetHost();返回URL的主机名。IntgetPort();返回URL的端口号,如果没有设置端口号返回值为–1)。StringgetFile();返回URL的文件名及路径。Strin
ggetRef();返回URL的标记。4.用URL获取网上HTML文件分为三步:(1)构造URL的对象:url=newURL(“http://www.cug.edu.cn”);(2)将DataInputStream类对象与url的openStrean()流对象绑定
:DataInputStreamdin=newDataInputStream(url.openStrean())(3)利用din读HTML文件。例3用URL获取网络上资源的HTML文件:importjava.
net.*;importjava.io.*;publicclassReadURL{staticpublicvoidmain(Stringargs[]){try{URLurl=newURL(args[0]);DataInputStreamdin=newD
ataInputStream(url.openStream());StringinputLine;while((inputLine=din.readLine())!=null){System.out.println(inputLine);}din.close();}catch(Malfor
medURLExceptionme){}catch(IOExceptionioe){}}}运行下列dos命令:javaReadURLhttp://www.cug.edu.cn就可以看到中国地质大学主页的HTML文件。5.用URL获取文本和图像文本数据源可以是网上或者本机
上的任何文本文件。如果要用URL来获取图像数据,要使用方法getImage(URL)。这个方法会立即生成一个Image对象,并返回程序对象的引用,但这并不意味着图像文件的数据已经读到了内存之中,而是系统与此同时产生
一个线程去读取图像文件的数据。因此,就可能存在程序已经执行到了getImage()后面的语句部分,而系统还正在读图像文件数据的情形。例4用URL来获取文本文件(.txt)和图像文件(.jpeg,.gif)。importjava.net.*;imp
ortjava.awt.*;importjava.io.*;publicclassGetDataByURLextendsFrame{MenuBarmenuBar;booleandrawImage=false;DataInputStrea
mdataInputStream;inti=0;Stringline_str;booleanfirst=true;Fontfont;publicGetDataByURL(){menuBar=newMenuBar()
;setMenuBar(menuBar);Menudisplay=newMenu("display");menuBar.add(display);MenuItembeauty_display=newMenu
Item("displaybeauty");MenuItemtext_display=newMenuItem("displaytext");display.add(beauty_display);display.add(t
ext_display);setBackground(Color.white);font=newFont("System",Font.BOLD,20);setTitle("sample:useURLgetdata");resize
(400,300);show();}publicbooleanaction(Eventevt,Objectwhat){if(evt.targetinstanceofMenuItem){Stringme
ssage=(String)what;if(message=="displaybeauty"){drawImage=true;doDrawImage();}else{drawImage=false;first=true;if(m
essage=="displaytext")doWrite("file:///d:/plbackup/tt.txt");}}returntrue;}publicbooleanhandleEvent(Eventevt){switch(evt.id
){caseEvent.WINDOW_DESTROY:dispose();System.exit(0);default:returnsuper.handleEvent(evt);}}staticpubli
cvoidmain(Stringargs[]){newGetDataByURL();}publicvoidpaint(Graphicsg){if(drawImage){try{URLimage_URL=newURL("file:///D:/plb
ackup/zy4.jpeg");Toolkitobject_Toolkit=Toolkit.getDefaultToolkit();Imageobject_Image=object_Toolkit.getImage(image_URL);g.setColor(Color.white);g
.fillRect(0,0,300,400);g.drawImage(object_Image,40,80,160,200,this);}catch(MalformedURLExceptione){}}else{if(first){fi
rst=false;g.setColor(Color.white);g.fillRect(0,0,400,300);g.setFont(font);}if(line_str!=null)g.drawString(line_str,10,i*20
);i++;}}privatevoiddoDrawImage(){drawImage=true;repaint();}privatevoiddoWrite(Stringurl_str){try{URLu
rl=newURL(url_str);dataInputStream=newDataInputStream(url.openStream());try{i=1;line_str=dataInputStream.readLine();while(line_str!
=null){paint(getGraphics());line_str=dataInputStream.readLine();}}catch(IOExceptione){}dataInputStream.close();}catch(Malfo
rmedURLExceptionel){}catch(IOExceptione2){}}}2.3URLConnection()类URL类仅提供读取地址为URL的Web服务器内容的方法。如果不仅要读取其内容,而且要向URL对象发送服务请求及参数,那么必须
要使用URLConnection()类。利用URL类提供的openConnection()方法,可以建立一个URLConnection类对象。然后,可以使用这个URLConnection类对象绑定的数据输入流读URL的内容,使用这个URLConnection类对象绑定的数据输出流发
送服务请求及参数。URLConnection类是一个以http为中心的类,同时支持get和post两种方法,默认情况下为post方法。URL和URLConnection的区别在于前者代表一个资源的位置,后者代表一种连接。1.读取URL对象内容例5利用URLConnection类获取网络
上的HTML文件。importjava.net.*;importjava.io.*;publicclassReadURLConnection{staticpublicvoidmain(Stringargs[]){try{URLcumtURL=newURL
("http://www.cug.edu.cn/");URLConnectioncumtConnection=cumtURL.openConnection();DataInputStreamdin=NewDataInputStr
eam(cumtConnection.getInputStream());StringinputLine;while((inputLine=din.readLine())!=null){System.out.println(inputLine);}din.close();}catch(M
alformedURLExceptionme){}catch(IOExceptionioe){}}}2.与URL对象交互利用URLConnection类对象向URL对象发送服务请求及参数,这里以Java程序与服务器端的CGI(CommenGatewayInte
rface,公共网关)交互为例,具体实现步骤如下。(1)创建URL(包括CGI文件名)对象。(2)打开一个到该URL的连接,建立相应的URLConnection对象。(3)从URLConnection对象获取其绑定的输出流。这个输出流就是连接
到服务器上CGI的标准输入流(stdin)。(4)向这个输出流中写数据,并关闭这个输出流.(5)从URLConnection对象获取其绑定的输入流。这个输入流就是连接到服务器上CGI的标准输出流(std
out);从这个输入流中读服务结果。关闭这个输入流。例6通过URLConnection对象运行java.sun.com上一个叫backwards的CGI,backwards将其反转后写到标准输出。这个CGI需要下面这种格式的输入string=string_to_reverse,
这里string_to_reverse参数就是要反转的字符串。CGIbackwards可执行文件从标准输入读取字符串,将其转换成大写字符串写到标准输出。这种标准输入格式为:“string=string_to_reverse”,这里string_to_reverse参数就是要转换成
大写的字符串,如图2所示。图2例1-6的Java程序与Web/CGI交互例6利用URLConnection类向CGI发送请求消息。importjava.net.*;importjava.io.*;publicclassRequestURLConnection{staticpubli
cvoidmain(Stringargs[]){try{Stringstring_to_reverse=URLEncoder.encode(args[0]);URLexampleURL=newURL("http://java.sun.com/cgi-bin/backwards
");URLConnectionexampleConnection=exampleURL.openConnection();PrintStreamdout=newPrintStream(newDataOutputStream(exampleConnection.getOutputStream
()));dout.println("string="+string_to_reverse);dout.close();DataInputStreamdin=newDataInputStream(example
Connection.getInputStream());StringinputLine;while((inputLine=din.readLine())!=null){System.out.println(in
putLine);}din.close();}catch(MalformedURLExceptionme){System.err.println("MalformedURLException"+me);}catch(IOExceptionioe){System.err.p
rintln("IOException"+ioe);}}}运行javaRequestURLConnectionabcd命令,结果:abcdreversedis:dcba