1、JAVA核心技术,网络通讯,2,网络通讯,Java提供java.io包进行io操作 Java提供将对象序列化的方法将对象持久化或者通过网络传输,3,本章相关词汇,4,网络通讯,网络基础知识 IP地址与端口 包 InetAddress Socket ServerSocket UDP URL 扩展IO流的相关知识,5,网络通讯,包 InetAddress Socket ServerSocket,6,计算机网络与通信,通信是人类生活中最重要的需求之一; 通信是指:对语言、文字、声音和图片以及其它任何类型的相关数据进行传输; 计算机的出现以及网络的构成,使得数据通信更加快速有效。,7,网络原理,网络就
2、是一组连接在一起的计算机。,使用网卡、电缆、集线器等连接设备连接计算机以组成网络。,8,客户端/服务器模式,网络发展,促使客户端/服务器模式应运而生; 通过网络,向另一台计算机请求服务的计算机称为客户端,而处理请求的计算机称为服务器; 如数据服务器,需要数据的客户端机器向数据服务器提出请求,而服务器则处理客户端的请求并向其发送所需的数据; 客户端/服务器的优势在于: 服务器和客户端分摊任务,分别负责部分处理工作; 服务器可以同时为多台客户端服务; 多个客户端可以同时访问服务器上的相同数据。,9,IP地址,网络中有多台计算机,它们必须通过某种标识来区分每一台机器,这就是IP地址; IP地址由4个
3、字节共32位二进制数组成,类似于:192.168.0.8; 在网络寻找某一台计算机都是依靠它的IP地址(用域名或计算机名定位主机其实也是通过某种服务转成IP地址后再找到该主机的); 网络ID:网络ID标识了计算机或网络设备所在的网段; 主机ID:主机ID标识了特定的主机或网络设备,10,特殊IP地址,许多网络地址被保留用于特殊用途; 0.0.0.0和127.0.0.1就是两个此类地址,第一个称为缺省路由,后一个是环回地址; 127.0.0.1被保留用于用户主机的本地IP话务,它被分配给一个特殊接口,即起到闭合电路作用的环回接口。,11,端口,在一台物理性的计算机中,往往运行着多个网络程序,一个
4、IP地址并不足以完整标识一个服务器,因此,端口是机器内部独一无二的场所; 一台计算机上可能同时运行多个网络程序,IP地址只能确保把数据送到指定的计算机,但不能保证把这些数据传递给哪个网络程序; 端口使用一个16位的数字来表示,它的范围是065535,1024以下的端口号保留给预定义的服务,如:http使用80端口; 网络间通信其实是在网络应用程序端口之间进行的。,12,包,使用包可以实现Java的网络功能,其中包含了一系列与网络通讯相关的类,比较重要的有: InetAddress Socket ServerSocket 如果要进行网络通讯编程的话,必须导入此包。,13,.InetAddress
5、,InetAddress用来表示互联网协议(IP)地址,它的实例将IP地址和DNS(主机名解析)进行了封装; 该类无法直接实例化,只能通过下列静态工厂方法获得实例:,14,InetAddress示例,import .*; /导入包public class InetAddressDemo public static void main(String args) try /获得当前本地主机的IP地址InetAddress add1 = InetAddress.getLocalHost();System.out.println(“当前本地主机:“ + add1);/根据域名,通过DNS域名解析,获得
6、相应服务的主机地址InetAddress add2 = InetAddress.getByName(““);System.out.println(“网易服务器主机:“ + add2);/根据字符串表现形式的IP地址获得相应的主机地址(若果网络上有该IP地址的话)InetAddress add3 = InetAddress.getByName(“192.168.0.22“);System.out.println(“IP地址为192.168.0.22的主机:“ + add3);/根据机器名获得相应的主机地址(如果网络上有该机器名的话)InetAddress add4 = InetAddress.g
7、etByName(“J104“);System.out.println(“机器名为J104的主机:“ + add4); catch (UnknownHostException uhe) uhe.printStackTrace(); ,15,InetAddress的其它方法,16,套接字,网络上计算机通过TCP/IP协议进行通信,而套接字(socket)则将这些通信协议进行了封装; TCP/IP套接字用于在主机和Internet之间建立可靠的、双向的、持续的、点对点的流式连接; socket用于描述IP地址和端口,应用程序通过套接字向网络发出请求或者应答网络请求; 也就是说,套接字起到通信端点的
8、作用; 客户端和服务器通过套接字建立连接和通信。,17,套接字通信原理,TCP/IP协议,网 卡,网络管理软件,socket,socket,主机甲上的A程序将一段数据写入socket中,主机乙上的B程序从socket中读取这段数据,18,.Socket,Socket类用于创建套接字对象,其构造方法共有9种重载,常用的有如下几种:套接字会因为网络的连接中断而失效,所以对它的操作都有可能抛出IOException,19,Socket的常用方法,一旦Socket对象被成功创建,就可以获得访问与之相关的输入/输出流的权力,通过流操作从套接字中发送(输出)和接收(输入)数据:,20,Socket的其它方
9、法,使用下面的方法,可以在任何时候检查套接字的地址和与之相关的端口信息:,21,.ServerSocket,ServerSocket类用来创建服务器套接字,它监听本地或远程客户程序通过公共端口的连接; ServerSocket类有4个重载的构造方法,以下是常用的:ServerSocket的常用方法如下:,22,Socket编程,编写服务器端程序: 创建一个服务器套接字(ServerSocket),绑定到指定端口; 调用accept方法,侦听来自客户端的请求,如果客户发出请求,则接受连接,返回通信套接字(Socket); 调用Socket的getInputStream和getOutputStre
10、am方法,获得输入/输出流,开始网络数据的接收和发送; 关闭通信套接字,关闭服务器套接字。,23,Socket编程,编写客户端程序: 创建一个套接字(Socket) ,向服务器的侦听端口发出请求; 与服务器正确连接后,调用Socket的getInputStream和getOutputStream方法,获得输入/输出流,开始网络数据的接收和发送; 关闭通信套接字。,24,Socket编程示意图,ServerSocket(int port),close(),close(),Socket(InetAddress address, int port),25,示例(服务端),public class S
11、erver private static final int SERVER_PORT = 9001; /指定侦听端口public Server() try ServerSocket ss = new ServerSocket(SERVER_PORT); /创建服务器套接字System.out.println(“服务端已启动,正在等待客户端.“);Socket s = ss.accept(); /侦听来自客户端的请求InputStream in = s.getInputStream(); /获得输入流,用来接收数据OutputStream out = s.getOutputStream(); /
12、获得输出流,用来发送数据byte buf = new byte1024;int len = in.read(buf); /从输入流中读取数据String strFromClient = new String(buf, 0, len);System.out.print(“来自客户端的信息“);System.out.println(strFromClient);String strToClient = “我也很好!“;out.write(strToClient.getBytes(); /往输出流中发送数据in.close(); out.close(); /关闭输入流和输出流s.close(); s
13、s.close(); /关闭通信套接字和服务器套接字System.out.println(“服务端已关闭。“); catch (IOException ioe) ioe.printStackTrace(); public static void main(String args) new Server(); ,26,示例(客户端),public class Client private static final int SERVER_PORT = 9001; /服务器的侦听端口public Client() try /由于服务端也是运行在本机,所以创建本机的InetAddress对象InetA
14、ddress address = InetAddress.getByName(“localhost“);Socket s = new Socket(address, SERVER_PORT); /向服务器侦听端口发出请求System.out.println(“客户端已启动。“);InputStream in = s.getInputStream(); /获得输入流,用来接收数据OutputStream out = s.getOutputStream(); /获得输出流,用来发送数据String strToServer = “你好!“;out.write(strToServer.getBytes
15、(); /往输出流中发送数据byte buf = new byte1024;int len = in.read(buf); /从输入流中读取数据String strFromServer = new String(buf, 0, len); System.out.print(“来自服务端的回答“);System.out.println(strFromServer);in.close();out.close(); /关闭输入流和输出流s.close(); /关闭通信套接字System.out.println(“客户端已关闭。“); catch (UnknownHostException nhe)
16、System.out.println(“未找到指定主机.“); catch (IOException ioe) ioe.printStackTrace();public static void main(String args) new Client(); ,UDP,用数据报方式编写client/server程序时,无论在客户方还是服务方,首先都要建立一个DatagramSocket对象,用来接收或发送数据报,然后使用DatagramPacket类对象作为传输数据的载体,UDP,接收端程序编写: 调用DatagramSocket(int port)创建一个数据报套接字,并绑定到指定端口上; 调
17、用DatagramPacket(byte buf, int length),建立一个字节数组以接收UDP包 。 调用DatagramSocket类的receive(),接收UDP包。 最后关闭数据报套接字。,UDP,发送端程序编写: 调用DatagramSocket()创建一个数据报套接字; 调用DatagramPacket(byte buf, int offset, int length, InetAddress address, int port),建立要发送的UDP包 调用DatagramSocket类的send(),发送UDP包。 最后关闭数据报套接字。,TCP与UDP的区别,UDP和
18、TCP协议的主要区别是两者在如何实现信息的可靠传递方面不同。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。 与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。,TCP与UDP的区别,相对于TCP协议,UDP协议的另外一个不同之处在于如何接收突法性的多个数据报。不同于TCP,UDP并不能确保数据的发送和接收顺序。,URL
19、,URL(Uniform Resource Locator)-统一资源定位器,表示Internet上某一资源的地址。 URL组成: 协议名和资源名protocol:resourceName URL举例: http:/ http:/ ftp:/,URL类,常用构造方法 public URL(String spec);例如:URL u1 = new URL(“http:/ public URL(URL context, String spec);例如: URL u2 = new URL(u1, “welcome.html”); public URL(String protocol, String
20、host, String file);例如: URL u3 = new URL(“http”, “”, “developers/index.html” ); public URL (String protocol, String host, int port, String file);例如: URL u4 = new URL(“http”, “”, 80, “developers/index.html” );,URL实例,public class URLConnectionReader public static void main(String args) throws Exception
21、 URL yahoo = new URL(“http:/ yc = yahoo.openConnection();BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream();String inputLine;while (inputLine = in.readLine() != null) System.out.println(inputLine);in.close(); ,35,关于IO流,在两台主机之间通过socket建立握手连接之后,主要是通过输入/输出流来接收和发送数据,实际上,对于网
22、络的操作,绝大部分是在操作IO流; 实际上操作网络端口流与操作磁盘文件流的原理是相似的; 出于效率的考虑,socket使用的是字节流,但是在实际操作中,字节往往会带来不便,所以我们一般会把字节流改造成字符流后进行操作。,36,改写示例(代码片段),public class Client /改用字符流的方式收发网络数据Socket s = new Socket(address, SERVER_PORT);InputStream is = s.getInputStream();InputStreamReader isr = new InputStreamReader(is);BufferedRea
23、der in = new BufferedReader(isr);OutputStream os = s.getOutputStream();PrintWriter out = new PrintWriter(os, true);out.println(strToServer);String strFromServer = in.readLine();out.close();in.close(); ,37,网络通讯,网络的发展促使计算机之间的通信日趋重要; 网络上的计算机通过IP地址来区分不同的机器,端口是数据的通道,使得多个应用程序在同一主机上进行网络通信; InetAddress用来描述主
24、机地址; Socket用来创建两台主机之间的连接; ServerSocket用来侦听来自客户端的请求; 我们实际上是通过操作IO流来进行数据的收发工作,将字节流改造成字符流会使操作更加方便。,网络通讯中,端口有什么含义。端口的取值范围?端口是一个主机中不同应用程序的标识,它是一个编号,CPU将根据这个编号决定把从网卡接收的的数据发送给哪一个应用程序进行处理。端口的本质是一个16位的无符号整数,因此它的取值范围为0-65535,1024之前的端口号称为保留端口,因为很多系统常见服务默认需要占用这些端口,因此我们自定义的网络服务要尽量避免使用这些端口号(自己实现的诸如HTTP、FTP等替代系统服务的应用除外),网络通讯,39,网络通讯,使用Socket与ServerSocket 实现客户端与服务器端的通信 习题2: 使用URL读取 的网页内容 习题3: 使用UDP实现客户端与服务器端的通信,