网络程序设计(java)第10章网络通信.ppt
《网络程序设计(java)第10章网络通信.ppt》由会员分享,可在线阅读,更多相关《网络程序设计(java)第10章网络通信.ppt(59页珍藏版)》请在三一办公上搜索。
1、2023/6/23,1,网络程序设计Network Programming第十章 网络通信,赵建立山东科技大学信息科学与工程学院College of Information Science and Engineering,Shandong University of Science and Technology,主要内容,10.1 网络通信简介10.2 URL通信 10.3 Socket通信 10.4远程方法调用(RMI),10.1 网络通信简介,网络通信的核心是协议。协议是指进程之间交换信息已完成任务所使用的一系列规则和规范。它主要包含两个方面的定义:1 定义了进程之间交换消息所必需遵循的顺
2、序。2 定义进程之间所交换的消息的格式。通过定义协议,可以看出,两个进程只要遵循相同的协议,就可以相互交换信息,而这两个进程可以用不同的编程语言编写,可以位于两个完全不同的计算机上。国际标准化组织给出了一个通用的参考协议,称为开放式系统互连参考模型(ISO/OSI RM)。,图14-1 ISO/OSI RM分层图,主要内容,10.1 网络通信简介10.2 URL通信 10.3 Socket通信 10.4远程方法调用(RMI),10.2 URL通信,10.2.1 URL简介 10.2.2 URL类 10.2.3 通过字节流访问WWW资源 10.2.4 通过URLConnection实现双向通信
3、使用HttpURLConnection,10.2.1 URL简介,URL用来网络资源定位,它的值由5部分组成,格式如下所示:/:/其中传输协议(protocol)指明获取资源所使用的传输协议,如http、ftp、mms等。主机名(hostname)指定资源所在的计算机,可以是IP地址,如,也可以是主机名或域名,如。一个计算机中可能有多种服务(应用程序),端口号(port)用来区分不同的网络服务,如http服务的默认端口号是80,ftp服务的默认端口号是21等。文件名(filename)包括该文件的完整路径。在http协议中,缺省的文件名是index.html,因此,,就相等同于。引用(refe
4、rence)为资源内的某个引用,用来定位显示文件内容的位置,如http:/,10.2 URL通信,10.2.1 URL简介 10.2.2 URL类 10.2.3 通过字节流访问WWW资源 通过URLConnection实现双向通信使用HttpURLConnection,10.2.2 URL类,1)URL(String spec),spec为一个完整的URL地址2)URL(String protocol,String host,int port,String file)将一个URL地址分解,按不同部分分别指定协议、主机、端口、文件。例如:URL u=new URL(“http”,”,80,“”)
5、;3)URL(URLcontext,Stringspec)这种方法基于一个已有的URL对象创建一个新的URL对象,多用于访问同一个主机上不同路径的文件,例如:URL u=new URL(“http:/:80/docs/books/”);URL u1=new URL(u,”);URL u2=new URL(u,”);,【例10-1】URL的使用,import java.io.*;import.*;public class URL1public static void main(String args)throws IOExceptionURL url=new URL(http:/=+url.ge
6、tAuthority();System.out.println(Default port=+url.getDefaultPort();System.out.println(File=+url.getFile();System.out.println(Host=+url.getHost();System.out.println(Path=+url.getPath();System.out.println(Port=+url.getPort();System.out.println(Protocol=+url.getProtocol();System.out.println(Query=+url.
7、getQuery();System.out.println(Ref=+url.getRef();System.out.println(User Info=+url.getUserInfo();,101运行结果,10.2 URL通信,10.2.1 URL简介 10.2.2 URL类 10.2.3 通过字节流访问WWW资源 通过URLConnection实现双向通信 使用HttpURLConnection,10.2.3 通过字节流访问WWW资源,URL对象创建后,就可以通过它来访问指定的WWW资源。这时需要调用URL类的openStream()方法,该方法与指定的URL建立连接并返回一个Input
8、Stream类的对象,这样访问网络资源的操作就变成了我们熟悉的I/O操作,接下来就可以用字节流的方式读取资源数据。,【例10-2】通过URL对象访问资源,import java.io.*;import.*;public class URL2public static void main(String args)throws IOExceptionURL url=new URL(“”);InputStreamReader isr=new InputStreamReader(url.openStream();BufferedReader br=new BufferedReader(isr);Str
9、ing s;while(s=br.readLine()!=null)System.out.print(s);br.close();,10.2 URL通信,10.2.1 URL简介 10.2.2 URL类 10.2.3 通过字节流访问WWW资源 通过URLConnection实现双向通信 10.2.5 使用HttpURLConnection,通过URLConnection实现双向通信,实际应用中,只能读取数据是不够的,很多情况下,我们都需要将一些信息发送到服务器中去,这就要求我们能够实现同网络资源的双向通信,URLConnection类就是用来解决这一问题的。类URLConnection也是定义
10、在包里,它表示Java程序和URL在网络上的通信连接。当与一个URL建立连接时,首先要在一个URL对象上通过方法openConnection()生成对应的URLConnection对象。URLConnection是以HTTP协议为中心的类,其中很多方法只有在处理HTTP的URL时才起作用。,1.建立连接 URL url=new URL(“”);URLConnection con=url.openConnection();2.向服务器端送数据 PrintStream ps=new PrintStream(con.getOutputStream();ps.println(string_data);
11、3.从服务器读数据 DataInputStreamdis=new DataInputStream(con.getInputStream();dis.readLine();,【例10-3】URLConnection的使用,import java.io.*;import.*;public class ComWithCgipublic static void main(String args)throws Exception/建立指向本地磁盘上cgi的URL对象URL url=new URL(“http:/URLConnection connection=url.openConnection();c
12、onnection.setDoOutput(true);PrintStream ps=new PrintStream(connection.getOutputStream();ps.println(0123456789);ps.close();/向服务器输出数据DataInputStream dis=new DataInputStream(connection.getInputStream();String inputLine;while(inputLine=dis.readLine()!=null)System.out.println(inputLine);dis.close();/从服务器
13、读数据,10.2 URL通信,10.2.1 URL简介 10.2.2 URL类 10.2.3 通过字节流访问WWW资源 通过URLConnection实现双向通信 10.2.5 使用HttpURLConnection,10.2.5 使用HttpURLConnection,HttpURLConnection是URLConnection的子类。HttpURLConnection提供了对Http协议的支持,如果所访问的URL地址是一个Http地址,那么就可以使用HttpURLConnection。例如:URL url=new URL(http:/);HttpURLConnection connect
14、ion=(HttpURLConnection)url.openConnection();但是要注意如果URL地址不是一个http地址,那么就无法用类型转换获取HttpURLConnection的实例。由于HttpURLConnection是URLConnection的子类,因此HttpURLConnection具有URLConnection的全部public方法,HttpURLConnection的基本用法也与URLConnection相同。,HttpURLConnection独特的方法,public void disconnect(),断开与服务端的连接。public InputStream
15、 getErrorStream(),返回错误流(Error Stream),所谓错误流是指连接失败时服务端返回的有用数据,这些有用数据通常通过错误流返回。例如服务器端返回404错误时(表示所访问的文件无法找到)。public String getRequestMethod(),返回请求的类型,请求类型包括Get、POST、HEAD、OPTIONS、PUT、DELETE、TRACE。public int getResponseCode(),返回服务器端响应的状态字,例如200表示OK,401表示Unauthorized。public String getResponseMessage(),返回服
16、务器端的响应消息,例如“HTTP/1.0 200 OK”或者“HTTP/1.0 404 Not Found”。public void setRequestMethod(String method),设置请求的类型,请求类型包括Get、POST、HEAD、OPTIONS、PUT、DELETE、TRACE。public boolean usingProxy(),返回当前HTTP连接是否使用了代理服务器。,主要内容,10.1 网络通信简介10.2 URL通信 10.3 Socket通信 10.4远程方法调用(RMI),10.3 Socket通信,服务器程序 10.3.2 客户机程序 10.3.3 服
17、务多个客户 10.3.4 数据报通信,客户-服务器模型,服务器程序,服务器的任务就是等候建立一个连接,然后用那个连接产生的Socket 创建一个InputStream 以及一个OutputStream。之后,从InputStream 读入的所有东西都会反馈给OutputStream,直到接收到行中止(END)为止,最后关闭连接。客户机连接与服务器的连接,然后创建一个OutputStream。文本行通过OutputStream 发送。客户机也会创建一个InputStream,用它收听服务器说些什么。服务器与客户机(程序)都使用同样的端口号,而且客户机利用本地主机地址连接位于同一台机器中的服务器(
18、程序),所以不必在一个物理性的网络里完成测试。,注意,ServerSocket 只要一个端口编号,不需要IP 地址(因为它就在这台机器上运行)。调用accept()时,方法暂时陷入停顿状态,直到某个客户尝试同它建立连接。建好一个连接以后,accept()会返回一个Socket对象,它是那个连接的代表。假如ServerSocket 构建器失败,则程序简单地退出(注意必须保证ServerSocket 的构建器在失败之后不会留下任何打开的网络套接字)。针对这种情况,main()会“掷”出一个IOException 违例,所以不必使用一个try 块。若ServerSocket 构建器成功执行,则其他所
19、有方法调用都必须到一个try-finally 代码块里寻求保护,以确保无论块以什么方式留下,ServerSocket 都能正确地关闭。,同样的道理也适用于由accept()返回的Socket。若accept()失败,那么我们必须保证Socket 不再存在或者含有任何资源,以便不必清除它们。但假若执行成功,则后续的语句必须进入一个try-finally 块内,以保障在它们失败的情况下,Socket 仍能得到正确的清除。由于套接字使用了重要的非内存资源,所以在这里必须特别谨慎,必须自己动手将它们清除。无论ServerSocket 还是由accept()产生的Socket 都打印到System.ou
20、t 里。这意味着它们的toString方法会得到自动调用。这样便产生了:ServerSocketaddr=0.0.0.0,PORT=0,localport=8080Socketaddr=127.0.0.1,PORT=1077,localport=8080在后面的程序中大家会看到它们如何与客户程序做的事情配合。,程序的下一部分看来似乎仅仅是打开文件,以便读取和写入,只是InputStream 和OutputStream 是从Socket 对象创建的。利用两个“转换器”类InputStreamReader 和OutputStreamWriter,InputStream 和OutputStream
21、对象已经分别转换成为Java 1.1 的Reader 和Writer 对象。也可以直接使用Java1.0 的InputStream 和OutputStream 类,但对输出来说,使用Writer 方式具有明显的优势。这一优势是通过PrintWriter 表现出来的,它有一个过载的构建器,能获取第二个参数一个布尔值标志,指向是否在每一次println()结束的时候自动刷新输出(但不适用于print()语句)。每次写入了输出内容后(写进out),它的缓冲区必须刷新,使信息能正式通过网络传递出去。对目前这个例子来说,刷新显得尤,为重要,因为客户和服务器在采取下一步操作之前都要等待一行文本内容的到达。
22、若刷新没有发生,那么信息不会进入网络,除非缓冲区满(溢出),这会为本程序带来许多问题。编写网络应用程序时,要特别注意自动刷新机制的使用。每次刷新缓冲区时,须创建和发出一个数据包(数据封)。就目前的情况来说,这正是我们所希望的,因为假如包内包含了还没有发出的文本行,服务器和客户机之间的相互联系就会停止。换句话说,一行的末尾就是一条消息的末尾。但在其他许多情况下,消息并不是用行分隔的,所以不如不用自动刷新机制,而用内建的缓冲区判决机制来决定何时发送一个数据包。这样一来,我们可以发出较大的数据包,而且处理进程也能加快。,注意和我们打开的几乎所有数据流一样,它们都要进行缓冲处理。无限while 循环从
23、BufferedReader in 内读取文本行,并将信息写入System.out,然后写入PrintWriter.out。注意这可以是任何数据流,它们只是在表面上同网络连接。客户程序发出包含了END的行后,程序会中止循环,并关闭Socket。,【例10-4】Socket通信程序,/Server_Socket.javaimport java.io.*;import.*;public class Server_Socket public static final int PORT=8080;public static void main(String args)throws IOExceptio
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络程序设计 java 10 网络 通信
链接地址:https://www.31ppt.com/p-5301327.html