11+第11章+Java网络编程.ppt
第11章 Java网络编程 学习内容基于URL的高层次Java网络编程基于Socket的低层次Java网络编程11.1 基于URL的高层次Java网络编程一致资源定位器URLURL的组成 创建一个URL 解析一个URL 一致资源定位器URL URL(Uniform Resource Locator)是一致资源定位器的简称,它表示Internet上某一资源的地址。通过URL我们可以访问Internet上的各种网络资源,比如最常见的WWW,FTP站点。浏览器通过解析给定的URL可以在网络上查找相应的文件或其他资源。URL是最为直观的一种网络定位方法。使用URL符合人们的语言习惯,容易记忆,所以应用十分广泛。而且在目前使用最为广泛的TCP/IP中对于URL中主机名的解析也是协议的一个标准,即所谓的域名解析服务。使用URL进行网络编程,不需要对协议本身有太多的了解,功能也比较弱,相对而言是比较简单的,所以在这里我们先介绍在Java中如何使用URL进行网络编程来引导读者入门。URL的组成 protocol:/resourceName协议名(protocol)指明获取资源所使用的传输协议,如http、ftp、gopher、file等,资源名(resourceName)则应该是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。例如:http:/ 协议名:/机器名文件名http:/:80/Gamelan/network.html#BOTTOM 协议名:/机器名端口号文件名内部引用.创建一个URL为了表示URL,中实现了类URL。我们可以通过下面的构造方法来初始化一个URL对象:(1)public URL(String spec);通过一个表示URL地址的字符串可以构造一个URL对象。URL urlBase=new URL(http:/ URL(URL context,String spec);通过基URL和相对URL构造一个URL对象。URL net263=new URL(http:/ index263=new URL(net263,index.html)创建一个URL 续(3)public URL(String protocol,String host,String file);new URL(http,/pages/G.html);(4)public URL(String protocol,String host,int port,String file);URL gamelan=new URL(http,80,Pages/Gwork.html);解析一个URL 类URL所提供的方法:public String getProtocol()获取该URL的协议名。public String getHost()获取该URL的主机名。public int getPort()获取该URL的端口号,如果没有设置端口,返回-1。public String getFile()获取该URL的文件名。public String getRef()获取该URL在文件中的相对位置。public String getQuery()获取该URL的查询信息。public String getPath()获取该URL的路径public String getAuthority()获取该URL的权限信息public String getUserInfo()获得使用者的信息public String getRef()获得该URL的锚示例:public class ParseURL public static void main(String args)throws Exception URL Aurl=new URL(http:/:80/docs/books/);URL tuto=new URL(Aurl,tutorial.intro.html#DOWNLOADING);System.out.println(protocol=+tuto.getProtocol();System.out.println(host=+tuto.getHost();System.out.println(filename=+tuto.getFile();System.out.println(port=+tuto.getPort();System.out.println(ref=+tuto.getRef();System.out.println(query=+tuto.getQuery();System.out.println(path=+tuto.getPath();System.out.println(UserInfo=+tuto.getUserInfo();System.out.println(Authority=+tuto.getAuthority();protocol=httphost=filename=/docs/books/tutorial.intro.htmlport=80ref=DOWNLOADINGquery=nullpath=/docs/books/tutorial.intro.htmlUserInfo=nullAuthority=:80结果从URL读取WWW网络资源 示例:public class URLReader public static void main(String args)throws Exception/声明抛出所有例外URL tirc=new URL(http:/127.0.0.1:8080/);/构建一URL对象BufferedReader in=new BufferedReader(new InputStreamReader(tirc.openStream();/使用openStream得到一输入流并由此构造一个BufferedReader对象String inputLine;while(inputLine=in.readLine()!=null)/从输入流不断的读数据,直到读完为止System.out.println(inputLine);/把读入的数据打印到屏幕上in.close();/关闭输入流Resin®Default Home PageResin®Default Home PageThis is the default page for the Resin web server.结果11.2 基于Socket的低层次Java网络编程 Socket通讯Socket通讯的一般过程 创建Socket 客户端的Socket 服务器端的ServerSocket 打开输入/出流 关闭Socket 简单的Client/Server程序设计TCP与UDP的区别:TCP基于连接而UDP是无连接;TCP对系统资源的要求较多,而UDP少;UDP程序结构较简单;流模式与数据报模式:TCP保证数据正确性,UDP可能丢包。TCP保证数据顺序,UDP不保证。Socket通讯 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。Socket编程是低层次网络编程并不等于它功能不强大,恰恰相反,正因为层次低,Socket编程比基于URL的网络编程提供了更强大的功能和更灵活的控制,但是却要更复杂一些。Socket通讯的一般过程Socket通讯的一般过程 续使用Socket进行Client/Server程序设计的一般连接过程是这样的:Server端Listen(监听)某个端口是否有连接请求,Client端向Server端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client端都可以通过Send,Write等方法与对方通信。Socket通讯的一般过程 续对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:(1)创建Socket;(2)打开连接到Socket的输入/出流;(3)按照一定的协议对Socket进行读/写操作;(4)关闭Socket.第三步是程序员用来调用Socket和实现程序功能的关键步骤,其他三步在各种程序中基本相同。创建Socket java在包中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。构造方法如下:Socket(InetAddress address,int port);Socket(String host,int prot);ServerSocket(int port);其中address、host和port分别是双向连接中另一方的IP地址、主机名和端口号。例如:Socket client=new Socket(127.0.0.1.,80);ServerSocket server=new ServerSocket(80);客户端的Socket 下面是一个典型的创建客户端Socket的过程:trySocket socket=new Socket(127.0.0.1,4700);/127.0.0.1是TCP/IP协议中默认的本机地址catch(IOException e)System.out.println(Error:+e);服务器端的ServerSocket 下面是一个典型的创建Server端ServerSocket的过程:ServerSocket server=null;try server=new ServerSocket(4700);/创建一个ServerSocket在端口4700监听客户请求catch(IOException e)System.out.println(can not listen to:+e);Socket socket=null;try socket=server.accept();/accept()是一个阻塞的方法,一旦有客户请求,它就会返回一个Socket对象用于同、客户进行交互catch(IOException e)System.out.println(Error:+e);打开输入/出流 类Socket提供了方法getInputStream()和getOutStream()来得到对应的输入/输出流以进行读/写操作,这两个方法分别返回InputStream和OutputSteam类对象。为了便于读/写数据,我们可以在返回的输入/输出流对象上建立过滤流,如DataInputStream、DataOutputStream或PrintStream类对象,对于文本方式流对象,可以采用InputStreamReader和OutputStreamWriter、PrintWirter等处理。打开输入/出流 续例如:PrintStream os=new PrintStream(new BufferedOutputStreem(socket.getOutputStream();DataInputStream is=new DataInputStream(socket.getInputStream();PrintWriter out=new PrintWriter(socket.getOutStream(),true);BufferedReader in=new ButfferedReader(new InputSteramReader(Socket.getInputStream();关闭Socket 每一个Socket存在时,都将占用一定的资源,在Socket对象使用完毕时,要其关闭。在关闭Socket之前,应将与Socket相关的所有的输入/输出流全部关闭,以释放所有的资源。而且要注意关闭的顺序,与Socket相关的所有的输入/输出该首先关闭,然后再关闭Socket。os.close();is.close();socket.close();简单的Client/Server程序设计客户端程序示例请参照:TalkClient.java服务器端程序示例请参照:TalkServer.java