第十讲 网络通信 1、网络基本概念 2、Java与Internet 3、使用InetAddress 4、使用URL 5、Socket通信 6、数据报通信
1、网络基本概念 物理层 TCP/IP(Transmission Control Protocol传输控制协议/Internet Protocol网间协议)是Internet的主要协议,定义了计算机和外设进行通信所使用的规则。TCP/IP网络参考模型包括五个层次:应用层、传输层、网络层、链路层、物理层。 ISO/OSI网络参考模型则包括七个层次:应用层、表示层、会话层、传输层、网络层、链路层、物理层。
1、网络基本概念 大多数基于Internet的应用程序被看作TCP/IP网络的最上层——应用层, 如:ftp,http,smtp,pop3,telnet,nntp等。 网络层对TCP/IP网络中的硬件资源进行标识。连接到TCP/IP网络中的每台计算机(或其他设备)都有唯一的地址,这就是IP地址。IP地址实质上是一个32位的整数,通常以“%d.%d.%d.%d”的形式表示,每个d是一个8位整数。 在TCP/IP网络中,不同的机器之间进行通信时,数据的传输是由传输层控制的,这包括数据要发往的目标机器及应用程序、数据的质量控制等。 TCP/IP网络中最常用的传输协议就是TCP(Transport Control Protocol)和UDP(User Datagram Protocol)。
1、网络基本概念 一台机器通常只通过一条链路连接到网络上,即它只有一个IP地址,但一台机器中往往有很多应用程序需要进行网络通信,如何区分呢?这就要靠网络端口号(port)了。 端口号是一个标记机器的逻辑通信信道的正整数,端口号不是物理实体。IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的最后终结点,它是TCP和UDP的基础。 网络服务 http ftp 其他服务 23 telnet 端口 21 80 客户程序 Socket IP,port IP与端口号组合而得出的Socket,可以完全分辨Internet上运行的程序。
1、网络基本概念 端口号是用一个16位的整数来表达的,其范围为0~65535,其中0~1023为系统所保留,专门给那些通用的服务(well-known services),如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口为23,…因此,当我们编写通信程序时,应选择一个大于1023的数作为端口号,以免发生冲突。
1、网络基本概念 传输层通常以TCP和UDP协议来控制端点到端点的通信。用于通信的端点是由Socket来定义的,Socket是由IP地址和端口号组成的。 传输控制协议(TCP)是在端点与端点之间建立持续的连接而进行通信。建立连接后,发送端将发送的数据印记了序列号和错误检测代码,并以字节流的方式发送出去;接收端则对数据进行错误检查并按序列顺序将数据整理好,数据在需要时可以重新发送,因此整个字节流到达接收端时完好无缺。这与两个人打电话的情形是相似的。 TCP协议具有可靠性和有序性,并且以字节流的方式发送数据,它通常被称为流通信协议。
1、网络基本概念 与TCP协议不同,用户数据报协议(UDP)则是一种无连接的传输协议。利用UDP协议进行数据传输时,首先需要将要传输的数据定义成数据报(Datagram),在数据报中指明数据所要达到的端点(Socket,主机地址和端口号),然后再将数据报发送出去。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有比较高的效率,这与通过邮局发送邮件的情形非常相似。
1、网络基本概念
1、网络基本概念 TCP协议和UDP协议各有各的用处。当对所传输的数据具有时序性和可靠性等要求时,应使用TCP协议;当传输的数据比较简单、对时序等无要求时,UDP协议能发挥更好的作用,如ping、发送时间数据等。
2、Java与Internet ——Java中的网络通信 网络应用是Java语言取得成功的领域之一,它已经成为现在Internet上最流行的一种编程语言。Java语言在网络编程方面提供了许多方便,其他语言往往需要数页代码才能完成的事情,在Java中可能只需要一条语句就可以。 Java的网络通信分为三个层次: 最高一级的网络通信就是我们上一讲中所涉及到的从网络上下载Applet。客户端浏览器通过HTML文件中的<applet>标记来识别Applet,并解析Applet的属性,通过网络获取Applet得字节码文件。(由浏览器提供) 上一讲中所涉及到的声音播放和图象显示,其中声音文件和图象文件的获取是次一级的通信。通过类URL的对象指明文件所在位置,并从网络上下载声音和图象文件。(由Java开发环境提供) 最低一级的通信是利用java.net包中提供的类直接在程序中实现网络通信。(由Java语言开发包提供)
2、Java与Internet ——Java中的网络支持 针对网络通信的不同层次,Java提供的网络功能有四大类:InetAddress 、URLs、Sockets、Datagram。 InetAddress面向的是网络层(IP层),用于标识网络上的硬件资源。 URL面向的应用层,通过URL,Java程序可以直接送出或读入网络上的数据。 Sockets和Datagram面向的则是传输层。Sockets使用的是TCP协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信。Datagram则使用UDP协议,是另一种网络传输方式,它把数据的目的地纪录在数据包中,然后直接放在网络上。
2、Java与Internet ——Java中的网络支持 java.net包中的主要的类和可能产生的例外包括: 面向IP层的类:InetAddress (Inet4Address,Inet6Address) 面向应用层的类:URL、URLConnection 面向网络层的类: TCP协议相关类:Socket、ServerSocket UDP协议相关类:DatagramPacket、DatagramSocket、MulticastSocket 可能产生的例外: BindException、ConnectException、MalformedURLException、NoRouteToHostException、ProtocolException、SocketException、UnknownHostException、UnknownServiceException
3、使用InetAddress 类InetAddress可以用于标识网络上的硬件资源,它提供了一系列方法以描述、获取及使用网络资源。 InetAddress类没有构造函数,因此不能用new来构造一个InetAddress实例。通常是用它提供的静态方法来获取: public static InetAddress getByName(String host) :host可以是一个机器名,也可以是一个形如“%d.%d.%d.%d”的IP地址或一个DSN域名。 public static InetAddress getLocalHost() public static InetAddress[] getAllByName(String host) public static InetAddress getByAddress(String host, Byte[] addr) 这些方法通常会产生UnknownHostException例外,应在程序中捕获处理。 以下是InetAddress类的几个主要方法,通过上述方法获得InetAddress类的实例后就可以使用: public byte[] getAddress():获得本对象的IP地址(存放在字节数组中)。 public String getHostAddress():获得本对象的IP地址“%d.%d.%d.%d”。 public String getHostName():获得本对象的机器名。
3、使用InetAddress 下面的例子演示Java如何根据域名自动到DNS(域名服务器)上查找IP地址(与DNS服务器的连接减至一行): public class getIP { public static void main(String args[]) InetAddress pku = null; try{ pku = InetAddress.getByName(“www.pku.edu.cn”); }catch(UnknownHostException e) {} System.out.println(pku); } getIP.java
3、使用InetAddress 通过InetAddress,可以获取本机的IP地址: getLocalHostTest.java public class getLocalHostTest { public static void main() InetAddress myIP = null; try{ myIP = InetAddress.getLocalHost(); }catch(UnknownHostException e){} System.out.println(myIP); } getLocalHostTest.java
4、使用URL URL是统一资源定位符(Uniform Resource Locator)的简称,它表示Internet上某一资源的地址。Internet上的资源包括HTML文件、图象文件、声音文件、动画文件以及其他任何内容(并不完全是文件,也可以是一个对数据库的查询等)。 通过URL,就可以访问Internet。浏览器或其他程序通过解析给定的URL就可以在网络上查找相应的文件或其他资源。
4、使用URL 一个URL包括两部分内容:协议名称和资源名称,中间用冒号隔开: Protocol:resourceName 如:http://gis.pku.edu.cn 协议名称指的是获取资源时所使用的应用层协议,如http,ftp,file等;资源名称则是资源的完整地址,包括主机名、端口号、文件名或文件内部的一个应用。当然,并不是所有的URL都必须包含这些内容。 http://www.pku.edu.cn http://gis.pku.edu.cn/javaCourse/index.html ftp://gis.pku.edu.cn/javaCourse/Techdoc/ch1.ppt http://www.abc.com:8080/java/network.html#UDP
4、使用URL ——在Java中构造URL 在java.net包中,提供了类URL来表示URL。类URL提供了很多构造方法来生成一个URL对象: public URL(String spec) public URL(URL context, String spec) public URL(String protocol, String host, String file) public URL(String protocol, String host, int port, String file) 以下是一些具体的构造实例: URL url1 = new URL(“http://gis.pku.edu.cn/map/index.html”); URL base = new URL(“http://gis.pku.edu.cn”); URL url2 = new URL(base, “mywork1.html”); URL url3 = new URL(base, “mywork2.html”); URL url4 = new URL(“http”, “gis.pku.edu.cn”,“/~lyw/test.html”); URL url5 = new URL(“http”, “www.abc.com”, 8080, “/java/network.html”); 另外还有两种稍微复杂些的构造方法(参见JDK文档)。
4、使用URL ——在Java中构造URL 当创建URL时发生错误,系统会产生例外MalformedURLException,这是非运行时例外,必须在程序中捕获处理。 URL url1,url2,url3; try{ url1 = new URL(“file:/D:/image/example.gif”); url2 = new URL(“http://gis.pku.edu.cn/map/”); url3 = new URL(url2, “test.gif”); }catch(MalformedURLException e) { DisplayErrorMessage(); }
4、使用URL ——URL的基本方法 一个URL对象生成后,其属性是不能被改变的(与String对象相似),但可以通过它给定的方法来获取这些属性: public String getProtocol():获取该URL的协议名 public String getHost() :获取该URL的主机名 public String getPort() :获取该URL的端口号 public String getPath() :获取该URL的文件路径 public String getFile() :获取该URL的文件名 public String getRef() :获取该URL在文件中的相对位置 public String getQuery() :获取该URL的查询名 ParseURL.java
4、使用URL ——通过URL读取www信息 通过URL类提供的方法openStream(),就可以读取一个URL对象所指定的资源。 public final InputStream openStream() 方法openStream()与指定的URL建立连接并返回一个InputStream对象,将URL位置的资源转成一个输入数据流。通过这个InputStream对象,就可以读取资源中的数据。 URL Java 程序 InputStream
4、使用URL ——通过URL读取www信息 URLReader.java import java.net.*; import java.io.*; public class URLReader { public static void main (String args[]) try{ URL gis = new URL("http://gis.pku.edu.cn/test.htm"); BufferedReader in = new BufferedReader( new InputStreamReader( gis.openStream() ) ); String line; while( (line = in.readLine()) != null ) System.out.println(line); } in.close(); }catch(Exception e){ System.out.println(e); URLReader.java
4、使用URL ——URL和InetAddress的联合使用 Applet中的网络通信需要将URL和InetAddress联合使用来得到相关的IP地址。 通过类Applet的getCodeBase()方法获得提供它的主机的URL实例 利用类URL的getHost()方法得到主机名 利用类InetAddress的getByName()得到该主机的IP地址 通过IP地址,就可以进行网络通信(TCP, UDP) URL url = getCodeBase(); String host = url.getHost(); Try{ InetAddress address = InetAddress.getByName(host); }catch(Exception e){} DatagramSocket socket = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(buf, length, address, port); socket.send(packet); AppletURLReader.java
4、使用URL ——URL连接 通过URL类提供的方法openConnection(),就可以获得一个URL连接(URLConnection)对象。 public URLConnection openConnection() 通过URL的方法openStream(),只能从网络上读取资源中的数据。通过URLConnection类,可以在应用程序和URL资源之间进行交互,既可以从URL中读取数据,也可以向URL中发送数据。URLConnection类表示了应用程序和URL资源之间的通信连接。 try{ URL url = new URL(“http://gis.pku.edu.cn”); URLConnection uc = url.openConnection(); }catch(MalformedURLException e1){ … }catch(IOException e2){ }
4、使用URL ——URL连接 通过getInputStream() 方法,应用程序就可以读取资源中的数据。 事实上,类URL的方法openStream()就是通过URLConnection类来实现的,它等价于: openConnection().getInputStream(); URLConnection中最常用的两个方法是: public InputStream getInputStream() public OutputStream getOutputStream() public class URLConnectionReader { public static void main (String args[]) try{ URL gis = new URL("http://gis.pku.edu.cn/test.htm"); URLConnection uc = gis.openConnection(); BufferedReader in = new BufferedReader( new InputStreamReader( uc.getInputStream() ) ); String line; while( (line = in.readLine()) != null ) System.out.println(line); } in.close(); }catch(Exception e){ System.out.println(e); URLConnectionReader.java
4、使用URL ——URL连接 通过URLConnection对象获取的输入流和输出流(不是所有的资源都可以获得有效的输出流),可以与现有的CGI程序进行交互。URL和URLConnection的区别在于前者代表一个资源的位置,后者代表一种连接。 URL url = new URL("http://gis.pku.edu.cn/~lyw/cgi-bin/test.cgi"); URLConnection uc = url.openConnection(); uc.setDoOutput(true); PrintStream out = new PrintStream(uc.getOutputStream()); BufferedReader in = new BufferedReader( new InputStreamReader( uc.getInputStream() ) ); 客户端 java程序 OutputStream InputStream CGI程序 STDIN STDOUT 服务器 connection getchar() putchar()
4、使用URL ——其他URL类 URLConnection类的其他方法以及其他URL相关的类(URLClassLoader,URLDecoder,URLEncoder,URLStreamHandler,HttpURLConnection,JarURLConnection,ContentHandler)的使用,大家在以后的实践中去学习。
5、Socket通信 在Java中,基于TCP协议实现网络通信的类有两个:在客户端的Socket类和在服务器端的ServerSocket类。 ServerSocket类的accept方法使服务器处于阻塞状态,等待用户请求。
5、Socket通信 ——类Socket 构造方法: 在JDK1.1以前,Socket类可同时用于TCP/UDP通信: public Socket(String host, int port) //远程服务器IP及响应端口 public Socket(InetAddress address, int port) public Socket(String host, int port, InetAddress localAddr, int localPort) public Socket(InetAddress address, int port, InetAddress localAddr, int localPort) //在指定的机器上的指定端口上运行 在JDK1.1以前,Socket类可同时用于TCP/UDP通信: public Socket(String host, int port, boolean stream) public Socket(InetAddress host, int port, boolean stream) 这些方法都将抛出例外IOException,程序中需要捕获处理。
5、Socket通信 ——类Socket Socket的输入/输出流管理 这些方法都将抛出例外IOException,程序中需要捕获处理。 public InputStream getInputStream() public void shutdownInput() public OutputStream getOutputStream() public void shutdownOutput() 这些方法都将抛出例外IOException,程序中需要捕获处理。 关闭Socket public void close() throws IOException 设置/获取Socket数据 public InetAddress getInetAddress()、public int getPort(),… public void setSoTimeout(int timeout),… 这些方法都将抛出例外SocketException,程序中需要捕获处理。
5、Socket通信 ——类ServerSocket 构造方法: 这些方法都将抛出例外IOException,程序中需要捕获处理。 主要方法 public ServerSocket(int port) public ServerSocket(int port, int backlog) //支持指定数目的连接 public ServerSocket(int port, int backlog, InetAddress bindAddr) //在指定的机器上运行 这些方法都将抛出例外IOException,程序中需要捕获处理。 主要方法 public Socket accept():等待客户端的连接 public void close():关闭Socket 设置/获取Socket数据 public InetAddress getInetAddress()、public int getLocalPort(),… public void setSoTimeout(int timeout),… 这些方法都将抛出例外SocketException,程序中需要捕获处理。
5、Socket通信 无论一个Socket通信程序的功能多么齐全、程序多么复杂,其基本结构都是一样的,都包括以下四个基本步骤: 1、在客户方和服务器方创建Socket/ServerSocket实例。 2、打开连接到Socket的输入/输出流。 3、利用输入/输出流,按照一定的协议对Socket进行读/写操作。 4、关闭输入/输出流和Socket。 通常,程序员的主要工作是针对所要完成的功能在第3步进行编程,第1、2、4步对所有的通信程序来说几乎都是一样的。
5、Socket通信 Server端程序 ServerSocket(port #) Socket socket = ServerSocket.accept() 接收连接 OutputStream InputStream Close Socket Client端程序 Socket(host, port #) 与服务器建立连接 socket
5、Socket通信 1、建立Socket 在客户端: 在服务器端: try{ Socket client = new Socket(host, 4444); }catch(IOException e){} 在服务器端: ServerSocket server = new ServerSocket(4444); Socket socket = null; socket = server.accept(); //等待客户端连接
5、Socket通信 2、在客户端和服务器端同时打开输入/输出流 类Socket提供了方法getInputStream()和getOutputStream()来得到Socket对应的输入/输出流以进行数据读写(传输)操作,它们分别返回InputStream对象和OutputStream对象。 为了便于读写数据,应在返回的输入/输出流对象上建立过滤流,如DataInputStram/DataOutputStram、BufferedInputStream/ BufferedOutputStream、PrintStream;InputStreamReader/ OutputStreamWriter、BufferedReader/ BufferedWriter、PrintWriter等。 BufferedReader = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); BufferedWriter = new BufferedWriter( new InputStreamWriter( socket.getOutputStream() ) );
5、Socket通信 3、关闭输入/输出流和Socket
服务器端 客户端 创建服务器(端口号) 定义数据成员 服务器等待 网络连接 建立socket流 发送谈话信息 接收用户谈话信息 接收服务器谈话信息 关闭流 accept() 127.0.0.1 4444 4444 结束谈话(Bye.) 服务器端 客户端
5、Socket通信 看看这个谈话程序的运行效果: 1、服务器端 SingleTalkServer.java 2、客户端 SingleTalkClient.java
5、Socket通信 ——简单的Client/Server 在本地机器上测试网络程序用回绕地址 Socket socket = new Socket(“127.0.0.1”, 4444); 建立socket连接后,还应该建立输入输出数据流。 要控制好输入/输出流和Socket关闭的时间。 如果网络的一端已经关闭,另一端读到null。 在运行时,服务器端程序一般应先行启动。
5、Socket通信 ——支持多Client 解决方案一: 在一台计算机上一次启动多个服务器程序,只要端口号不同。 myserver1 <-------->myclient1 myserver2<-------->myclient2 Server(1111) client(2222) Server(2222) client(1111) Server
5、Socket通信 ——支持多Client 解决方案二: 将服务器写成多线程的,不同的处理线程为不同的客户服务。主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。 //主线程 while (true) { accept a connection ; create a thread to deal with the client ; }end while Server client1 client2 serverthread2 serverthread1 ……
5、Socket通信 ——支持多Client serverSocket = new ServerSocket(4444); while (listening) { Socket socket; socket = serverSocket.accept(); //程序将在此等候客户端的连接 clientNumber++; //记录客户数目 new MultiTalkServerThread(socket, clientNumber).start(); //创建一个新线程处理此客户请求 } serverSocket.close(); class MultiTalkServerThread extends Thread { public MultiTalkServerThread(Socket socket, int clientNumber) this.socket = socket; this.clientNumber = clientNumber; } public void run() …
5、Socket通信 ——支持多Client 客户1 客户2 服务器 线程1( ) 线程2( ) MultiTalkServer.java
5、Socket通信 ——Client之间通过Server通信 服务器 (4444) accept socket 客 户 2 IP1 client1 线程1 1 IP2 client2 线程2
6、数据报通信 UDP协议是无连接的协议,它以数据报作为数据传输的载体。数据报是一个在网络上发送的独立信息,它的到达、到达时间以及内容本身等都不能得到保证。数据报的大小是受限制的,每个数据报的大小限定在64KB以内。 UDP协议无需在发送方和接收方建立连接,但也可以先建立连接。数据报在网上可以以任何可能的路径传往目的地。 在Java中,基于UDP协议实现网络通信的类有三个: 用于表达通信数据的数据报类DatagramPacket 用于进行端到端通信的类DatagramSocket 用于广播通信的类MulticastSocket。 datagram server client
6、数据报通信 ——数据报:类DatagramPacket 构造方法 获取数据——获取接收数据报中的信息 设置数据——设置发送数据报中的信息 public DatagramPacket(byte[] buf, int length) public DatagramPacket(byte[] buf, int offset, int length) //这两个方法用于描述接收数据报 public DatagramPacket(byte[] buf, int length, InetAddress address, int port) public DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) //这两个方法用于发送数据报 获取数据——获取接收数据报中的信息 public InetAddress getAddress() public byte[] getData() public int getLength() public int getOffset() public int getPort() 设置数据——设置发送数据报中的信息 setAddress(InetAddress iaddr)、setPort(int iport)、setData(byte[] buf)、setData(byte[] buf, int offset, int length) 、setLength(int length)
6、数据报通信 ——点到点通信:类DatagramSocket 构造方法 最主要的方法——发送与接收数据报 其他方法 public DatagramSocket() public DatagramSocket(int port) //在指定的端口通信 public DatagramSocket(int port, InetAddress laddr) //在指定的地点运行 这三个方法都将抛出例外SocketException,程序中需要捕获处理。 最主要的方法——发送与接收数据报 public void receive(DatagramPacket p) public void send(DatagramPacket p) 这两个方法都将抛出例外IOException,程序中需要捕获处理。 其他方法 public void connect(InetAddress address, int port) //与指定的机器通信,有连接 public void disconnect() //关闭与指定机器的连接 public void close() //关闭Socket
接收端(客户端) 发送端(服务器端) 建立数据报socket 建立一个接收数据报 建立一个请求数据报(发送) 发出请求 等待请求报文 获得对方地址(通过接收数据报) 构成发送数据报 发送出去 创建接收数据报 等待接收 接收端(客户端) 发送端(服务器端)
6、数据报通信 ——点到点通信 看看这个点到点通信程序的运行效果: 1、服务器端(发送端) SingleUDPServer.java 2、客户端(接收端) SingleUDPClient.java
6、数据报通信 ——点到点通信 发送端(服务器端)发出数据报的标准步骤: 1. 定义数据成员 DatagramSocket socket; DatagramPacket packet; InetAddress address;(用来存放接收方的地址) int port; (用来存放接收方的端口号) 2. 创建数据报Socket对象 try{ socket = new DatagramSocket(4445); }catch(java.net.SocketException e) {} socket 绑定到一个本地的可用端口,等待接收客户端的请求。
6、数据报通信 ——点到点通信 3.分配并填写数据缓冲区(一个字节类型的数组) byte[] buf = new byte[256]; 存放从客户端接收的请求信息。 4.创建一个接收数据报DatagramPacket packet = new DatagramPacket(buf, 256); 用来从socket接收数据,它只需要两个参数。 5. 服务器阻塞(等待接收数据) socket.receive(packet); 在客户的请求数据报到来之前一直等待。
6、数据报通信 ——点到点通信 6. 从到来的接收数据报中得到客户端的地址和端口号 InetAddress address = packet.getAddress(); int port = packet.getPort(); 7. 准备需要发送的数据:将数据送入缓冲区buf 或来自文件、或键盘输入 8. 建立发送数据报,用来从socket向客户端发送信息 packet = new DatagramPacket(buf, buf.length, address, port); 9. 发送数据包 socket.send(packet); 10.关闭socket socket.close();
6、数据报通信 ——点到点通信 接收端(客户端)接收数据报的标准步骤: 1. 定义数据成员 int port; InetAddress address; DatagramSocket socket; DatagramPacket packet; byte[] sendBuf = new byte[256]; 2. 建立socket socket = new DatagramSocket(); 无须指定端口号,它会自动获得一个可用的端口号。
6、数据报通信 ——点到点通信 3. 向服务器端发出请求数据报(发送数据报) address = InetAddress.getByName(args[0]); port = parseInt(args[1]); //获得服务器端的IP和端口号 packet = new DatagramPacket(sendBuf, 256, address, port); socket.send(packet); 这个数据报本身会带有客户端的信息 4. 客户端等待服务器端的应答(通过接收数据报接收数据) packet=new DatagramPacket(sendBuf, 256); socket.receive(packet); 如果没有到就一直等待,因此实用程序要设置等待时间限度 5. 处理接收到的数据 String received=new String(packet.getData(), 0); System.out.println(received);
6、数据报通信 ——广播通信 DatagramSocket只允许数据报发往一个目的地址。java.net类包中提供了类MulticastSocket,允许将数据报以广播的方式发送到某个端口的所有客户。 类MulticastSocket是在客户端(接收端)使用,监听服务器端广播来的数据;而服务器端仍然使用DatagramSocket来发送数据,只是发送的数据报的目的地址有所变化。
6、数据报通信 ——广播通信 类MulticastSocket:从DatagramSocket继承而来 构造方法 主要方法 public MulticastSocket() public MulticastSocket(int port) :在指定的端口通信 这两个方法都将抛出例外IOException,程序中需要捕获处理。 主要方法 public void joinGroup(InetAddress mcastaddr):加入一个广播组 public void leaveGroup(InetAddress mcastaddr):离开一个广播组 public void setTimeToLive(int ttl):指定数据报离开时间 public void send(DatagramPacket p, byte ttl):在指定的时间内将数据报发送出去 这四个方法都将抛出例外IOException,程序中需要捕获处理。 继承DatagramSocket的方法 public void receive(DatagramPacket p):接收数据 public void send(DatagramPacket p):发送数据 public void connect(InetAddress address, int port):与指定的机器通信 public void disconnect():关闭指定的连接 public void close():关闭Socket
6、数据报通信 ——广播通信 客户端 MulticastSocket socket = new MulticastSocket(4446); InetAddress group = InetAddress.getByName("230.0.0.1"); socket.joinGroup(group); … //receive datagram socket.leaveGroup(group); socket.close(); 服务器端 InetAddress group = InetAddress.getByName("230.0.0.1"); DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 4446); socket.send(packet);
6、数据报通信 ——广播通信 广播组的IP地址是一类特殊的IP地址,它们没有分配给网上的硬件资源使用,而是专门保留下来作为广播通信使用的(就像127.0.0.1是专门用来描述本机IP一样)。这一类地址的范围是从224.0.0.0到239.255.255.255,其中地址 224.0.0.0又被保留不能被一般应用程序所使用。 当前,广播通信只能在应用程序中使用,不能在Applet中使用。
6、数据报通信 许多防火墙和路由器可以配置为不允许UDP数据报进入。因此,如果想在这种环境下提供UDP网络服务,就需要请求系统管理员重新配置防火墙和路由器,以允许UDP数据报进入。
小结 实现网络功能要靠URL类、URLConection类、Socket类和DatagramSocket类。 网络上的数据传送是将网络连接转换成输入输出流。 DataInputStream和DataOutputStream (PrintStream)是网间流的载体。 URL适用于Web应用,如访问http服务器,是高层服务。 URLConection的另一边通常是CGI程序。
小结 回绕地址(127.0.0.1)可用于在本地机器上调试网络程序。 Socket适用于面向连接的,可靠性要求高的应用。 Datagram适用于效率要求高的应用。 Socket是由IP和端口构成的一种网上通信链路的一端。 Socket通信要分别运行服务器和客户程序。 服务器程序是多线程的,可处理多个客户的请求。
下一讲:JDBC JDBC基础 JDBC驱动程序 JDBC编程 示例