1、Advanced Network ProgrammingRen JNetworking BasicsApplications LayerStandard appsHTTPFTPTelnetUser appsTransport LayerTCPUDPProgramming Interface:SocketsNetwork LayerIPLink LayerDevice driversTCP/IP StackApplication(http,ftp,telnet,)Transport(TCP,UDP,.)Network(IP,.)Link(device driver,.)Networking Ba
2、sics TCP(Transport Control Protocol)is a connection-oriented protocol that provides a reliable flow of data between two computers.Example applications:HTTP FTP Telnet TCP/IP StackApplication(http,ftp,telnet,)Transport(TCP,UDP,.)Network(IP,.)Link(device driver,.)Networking Basics UDP(User Datagram Pr
3、otocol)is a protocol that sends independent packets of data,called datagrams,from one computer to another with no guarantees about arrival.Example applications:Clock server Ping TCP/IP StackApplication(http,ftp,telnet,)Transport(TCP,UDP,.)Network(IP,.)Link(device driver,.)Java基本网络类基本网络类本章介绍了Java基本的网
4、络类(InetAddress、URL、URLConnection和Socket)的使用,介绍如何利用Socket通信机制实现客户/服务器方式的一对一的通信,实现浏览器/服务器方式的网络聊天。1 Java网络进程通信概述网络进程通信概述 网络编程一般指利用不同层次的通信协议提网络编程一般指利用不同层次的通信协议提供的接口实现网络进程安全通信和应用的编程。供的接口实现网络进程安全通信和应用的编程。网络进程就是网点机(连入网络的计算机)网络进程就是网点机(连入网络的计算机)上运行的程序。网络进程在通信协议中用端口标上运行的程序。网络进程在通信协议中用端口标识(识(port),它驻留的网点机用其它驻留
5、的网点机用其IP地址或域名地址或域名来标识。来标识。网络进程同步通信是指通信的发起者向接收者网络进程同步通信是指通信的发起者向接收者发出服务请求后,必须得到对方回应,才继续运发出服务请求后,必须得到对方回应,才继续运行。如果通信的发起者向接收者发出服务请求后,行。如果通信的发起者向接收者发出服务请求后,可以继续运行,需要时再获取接收者的响应,这可以继续运行,需要时再获取接收者的响应,这叫异步通信。叫异步通信。网络协议工程就是利用软件工程的方法(分层次、分模块等技术)来解决复杂网络进程通信的问题。网络进程往往按照应用的需要,采用不同层次的协议进行通信。2 Java网络基本类2.1 InetAdd
6、ress类InetAddress类用来描述Internet地址。1.获取本机的IP地址例1 用InetAddress类获取本机的IP地址。import .*;import java.io.*;public class GetLocalHost public static void main(String arg)InetAddress myIp=null;try myIp=InetAddress.getLocalHost();catch(UnknownHostException e)System.out.println(myIp);2.根据域名获得IP地址例2 根据域名自动到DNS上查找IP地
7、址。import .*;import java.io.*;public class GetIP public static void main(String args)InetAddress cug=null;try cug=InetAddress.getByName();catch(UnknownHostException e)System.out.println(cug);getByName()public static InetAddress getByName(String host)throws UnknownHostExceptionInetAddress utopia,duke;
8、try utopia=InetAddress.getByName(utoa.poly.edu);duke=InetAddress.getByName(118.218.2.92);catch(UnknownHostException e)System.err.println(e);2.2 URL类 URL(Uniform Resource Locator)是WWW资源统一资源定位器的简写,它规范了WWW资源网络定位地址的表示方法。WWW资源包括Web页、文本文件、图形文件、声频片段等。1.URL类简介 URL类定义了WWW资源的特征及读其内容的方法。其基本表示格式:protocol:/hostn
9、ame:/resourcename#anchor 其中,protocol:使用的协议,它可以是http,ftp,news,telnet等;hostname:主机名,指定域名服务器(DNS)能访 问 到 的 W W W 服 务 的 计 算 机,如:;port:端口号,是可选的,表示所连的端口号,如默认,将连接到协议默认的端口。resourcename:资源名,是主机上能访问到的目录或文件;anchor:标记,也是可选的,它指定文件内的有特定标记的位置。URL例子:(1)http:/www.ncsa.uiuc.edu/demoweb/url-primer.htm (2)http:/www.ncsa
10、.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(URL absoluteURL)例:URL myUni=URL(“http:/ url,String relativeURL)例:URL myUni=URL(“htt
11、p:/ mydoc=URL(myUni,”mydoc.html”)(3)URL(String protocol,String host,String resourcename)例:URL myUni=URL(“http”,”,”/mydoc.html”);等价于:URL myUni=URL(“http:/ protocol,String host,int port,String resourcename)例:URL myUni=URL(“http”,”,80,”/mydoc.html”);等价于:URL myUni=URL(“http:/:80/mydoc.html”);3.URL类获取其特征
12、的主要方法 String getProtocol();返回URL的协议名。String getHost();返回URL的主机名。Int getPort();返回URL的端口号,如果没有设置端口号返回值为1)。String getFile();返回URL的文件名及路径。String getRef();返回URL的标记。4.用URL获取网上HTML文件 分为三步:(1)构造URL的对象:url=new URL(“http:/”);(2)将DataInputStream类对象与url的 openStrean()流对象绑定:DataInputStream din=new DataInputStream
13、(url.openStrean()(3)利用din 读HTML文件。例3 用URL获取网络上资源的HTML文件:import .*;import java.io.*;public class ReadURL static public void main(String args)try URL url=new URL(args0);DataInputStream din=new DataInputStream(url.openStream();String inputLine;while(inputLine=din.readLine()!=null)System.out.println(inp
14、utLine);din.close();catch(MalformedURLException me)catch(IOException ioe)运行下列dos命令:java ReadURL http:/就可以看到中国地质大学主页的HTML文件。5.用URL获取文本和图像 文本数据源可以是网上或者本机上的任何文本文件。如果要用URL来获取图像数据,要使用方法getImage(URL)。这个方法会立即生成一个Image对象,并返回程序对象的引用,但这并不意味着图像文件的数据已经读到了内存之中,而是系统与此同时产生一个线程去读取图像文件的数据。因此,就可能存在程序已经执行到了getImage()后
15、面的语句部分,而系统还正在读图像文件数据的情形。例4 用URL来获取文本文件(.txt)和图像文件(.jpeg,.gif)。import .*;import java.awt.*;import java.io.*;public class GetDataByURL extends FrameMenuBar menuBar;boolean drawImage=false;DataInputStream dataInputStream;int i=0;String line_str;boolean first=true;Font font;public GetDataByURL()menuBar=
16、new MenuBar();setMenuBar(menuBar);Menu display=new Menu(display);menuBar.add(display);MenuItem beauty_display=new MenuItem(display beauty);MenuItem text_display=new MenuItem(display text);display.add(beauty_display);display.add(text_display);setBackground(Color.white);font=new Font(System,Font.BOLD,
17、20);setTitle(sample:use URL get data);resize(400,300);show();public boolean action(Event evt,Object what)if(evt.target instanceof MenuItem)String message=(String)what;if(message=display beauty)drawImage=true;doDrawImage();else drawImage=false;first=true;if(message=display text)doWrite(file:/d:/plbac
18、kup/tt.txt);return true;public boolean handleEvent(Event evt)switch(evt.id)case Event.WINDOW_DESTROY:dispose();System.exit(0);default:return super.handleEvent(evt);static public void main(String args)new GetDataByURL();public void paint(Graphics g)if(drawImage)try URL image_URL=new URL(file:/D:/plba
19、ckup/zy4.jpeg);Toolkit object_Toolkit=Toolkit.getDefaultToolkit();Image object_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(MalformedURLException e)else if(first)first=false;g.setColor(Color.white);g.fillR
20、ect(0,0,400,300);g.setFont(font);if(line_str!=null)g.drawString(line_str,10,i*20);i+;private void doDrawImage()drawImage=true;repaint();private void doWrite(String url_str)try URL url=new URL(url_str);dataInputStream=new DataInputStream(url.openStream();tryi=1;line_str=dataInputStream.readLine();whi
21、le(line_str!=null)paint(getGraphics();line_str=dataInputStream.readLine();catch(IOException e)dataInputStream.close();catch(MalformedURLException el)catch(IOException e2)2.3 URLConnection()类 URL类仅提供读取地址为URL的Web服务器内容的方法。如果不仅要读取其内容,而且要向URL对象发送服务请求及参数,那么必须要使用URLConnection()类。利用URL类提供的openConnection()方法
22、,可以建立一个URLConnection类对象。然后,可以使用这个URLConnection类对象绑定的数据输入流读URL的内容,使用这个URLConnection类对象绑定的数据输出流发送服务请求及参数。URLConnection类是一个以http为中心的类,同时支持get和post两种方法,默认情况下为post 方法。URL和URLConnection的区别在于前者代表一个资源的位置,后者代表一种连接。1.读取URL对象内容例5 利用URLConnection类获取网络上的HTML文件。import .*;import java.io.*;public class ReadURLConne
23、ction static public void main(String args)try URL cumtURL=new URL(http:/ cumtConnection=cumtURL.openConnection();DataInputStream din=New DataInputStream (cumtConnection.getInputStream();String inputLine;while(inputLine=din.readLine()!=null)System.out.println(inputLine);din.close();catch(MalformedURL
24、Exception me)catch(IOException ioe)2.与URL对象交互 利用URLConnection类对象向URL对象发送服务请求及参数,这里以Java程序与服务器端的CGI(Commen Gateway Interface,公共网关)交互为例,具体实现步骤如下。(1)创建URL(包括CGI文件名)对象。(2)打开一个到该URL的连接,建立相应的URLConnection对象。(3)从URLConnection对象获取其绑定的输出流。这个输出流就是连接到服务器上CGI的标准输入流(stdin)。(4)向这个输出流中写数据,并关闭这个输出流.(5)从URLConnectio
25、n对象获取其绑定的输入流。这个输入流就是连接到服务器上CGI的标准输出流(stdout);从这个输入流中读服务结果。关闭这个输入流。例6 通过URLConnection对象运行上一个叫backwards的CGI,backwards将其反转后写到标准输出。这个CGI需要下面这种格式的输入string=string_to_reverse,这里string_to_reverse参数就是要反转的字符串。CGI backwards 可执行文件从标准输入读取字符串,将其转换成大写字符串写到标准输出。这种标准输入格式为:“string=string_to_reverse”,这里string_to_rever
26、se 参数就是要转换成大写的字符串,如图2所示。图2 例1-6 的Java程序与Web/CGI交互例6 利用URLConnection类向CGI发送请求消息。import .*;import java.io.*;public class RequestURLConnection static public void main(String args)try String string_to_reverse=URLEncoder.encode(args0);URL exampleURL=new URL(http:/ exampleConnection=exampleURL.openConnect
27、ion();PrintStream dout=n e w P r i n t S t r e a m(n e w DataOutputStream (exampleConnection.getOutputStream();dout.println(string=+string_to_reverse);dout.close();DataInputStream din=new DataInputStream (exampleConnection.getInputStream();String inputLine;while(inputLine=din.readLine()!=null)System.out.println(inputLine);din.close();catch(MalformedURLException me)System.err.println(MalformedURLException+me);catch(IOException ioe)System.err.println(IOException+ioe);运行java RequestURLConnection abcd 命令,结果:abcdreversed is:dcba