• 1. Java中的网络编程第11章
  • 2. 目 录网络基础URL 类InetAddress 类Socket 通信Datagram 数据报
  • 3. Java网络程序设计Java的快速发展得益于Internet和Web的出现,Java语言取得成功的领域之一就是网络。 其他语言:数页代码 Java 语言:一条语句 两台计算机通过网络进行通信。 java.net包 套接字API(Socket API) 统一资源定位器工具( URL API)
  • 4. 网络基本概念IP地址: 标识计算机等网络设备的网络地址,由四个8位的二进制数组成,中间以小数点分隔。 如:166.111.136.3 , 166.111.52.80 IP地址是一个逻辑地址,具有全球唯一性。 域名(domain name): 网络地址的助记名,按照域名进行分级管理。 如:computer.ldu.edu.cn 端口号(port number): 网络通信时同一机器上的不同进程的标识。 如:80,21,23,25,其中0~1023为系统保留的端口号。 服务类型(service): 网络的各种服务。http, telnet, ftp, smtp
  • 5. 1、网络基础C/S结构的通信:服务类型是在TCP层上面的应用层的概念。
  • 6. 两类传输协议:TCP、UDP TCP (Transmission Control Protocol 传输控制协议) 是一种面向连接的(connection-oriented)保证可靠传输的协议。 通过TCP协议传输,得到的是一个顺序的无差错的数据流。 远程连接(Telnet)和文件传输(FTP) UDP (User Datagram Protocol 用户数据报协议) 是一种无连接(connectionless)的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地, 正确性不能保证 既然有了保证可靠传输的TCP协议,为什么还要非可靠传输的UDP协议呢?
  • 7. 1、网络基础Java所提供的网络功能按层次及使用方法分为三大类: 1. URL 确定数据在网络中的位置,直接读入网络中的数据,或者将本地数据传送到网络的另一端。 2. Socket Socket是指两个程序在网络上的通信连接。( TCP) 3. DatagramSocket DatagramSocket方式是三种网络功能中最低级的一种,它是一种面向非连接的、以数据报方式工作的通信,适用于网络状况不可靠环境下的数据传输和访问。 ( UDP)
  • 8. 2、URL类URL类 读取URL中的资源 显示URL资源中的HTML文件 处理超链接
  • 9. 2、URLURL(Uniform Resource Locator)是统一资源定位器的简称,它表示Internet上某一资源的地址。 最常见的网络资源有WWW,FTP站点。 格式protocol: // resourceNamehttp://www.computer.ldu.edu.cn/ 协议名://主机名 http://www.computer.ldu.edu.cn/page/jgyl.htm 协议名://机器名+文件名 http://www.gamelan.com:80/Gamelan/network.html#BOTTOM 协议名://机器名+端口号+文件名+内部引用指明获取资源所使用的传输协议,如http、ftp、file等。资源的完整地址,包括主机名、端口号、文件名或文件内部的一个引用。
  • 10. (1)URL类构造方法: public URL(String spec) public URL(String protocol, String host, int port, String file) public URL(String protocol, String host, String file)//使用协议的默认端口 异常:MalformedURLException sameFile()方法将它与另一个URL加以比较,确定两个URL是否指向同一个资源try { url1=new URL("http://foo.bar.com/doc/homepage.html"); url2=new URL(“http”,“foo.bar.com”,“doc/homepage.html”); } catch(MalformedURLException e){ System.out.println ("Bad URL:"+url); }
  • 11. (1)URL类常用方法: getProtocol() //获得此URL的协议名称 getHost() //获得此URL的主机名 getPort() //获得此URL的端口号 getFile() //获得此URL的文件名 getRef() //获得此URL的锚点引用 getDefaultPort() //获得与此URL关联协议的默认端口号
  • 12. (2)读取URL中的资源URL对象调用InputStream openStream()方法,返回一个输入流,通过该输入流可以将服务器上的资源信息读入到客户端。 例子1,读取服务器上的资源。 说明:由于网络速度或其它的因素,URL资源的读取可能会引起堵塞,因此,程序需在一个线程中读取URL资源,以免堵塞主线程。 如果想看到网页的运行效果能否做到?
  • 13. (3)显示URL资源中的HTML文件Javax.swing包中的JEditorPane类可以解释执行html文件,把html文件读入到JEditorPane中。 构造方法: public JEditorPane() public JEditorPane(URL initialPage) throws IOException public JEditorPane(String url) throws IOException 显示新的URL中的资源: public void setPage(URL page) throws IOException 例子2
  • 14. (4)处理超链接例子11-3 editorPane.setEditable (false) 显示网页的运行效果; 单击网页中超链接还可以触发HyperlinkEvent事件,来显示新的URL资源。 editorPane.addHyperlinkListener (HyperlinkListener listener) 获得监视器。监视器需实现HyperlinkListener接口,该接口中的方法是: void hyperlinkUpdate(HyperlinkEvent e)editPane.addHyperlinkListener(new HyperlinkListener() { public void hyperlinkUpdate(HyperlinkEvent e) { if(e.getEventType()==HyperlinkEvent.EventType.ACTIVATED) { try{ editPane.setPage(e.getURL()); } catch(IOException e1) { editPane.setText(""+e1); } } } } ); }三种状态: ENTERED, EXITED, ACTIVATED
  • 15. 3、InetAddress类Internet上的主机有两种方式表示地址: (1)域名 如: www.ldu.edu.cn (2)IP 地址 如: 202.194.48.62 该类对象含有一个Internet主机地址的域名和IP地址: www.ldu.edu.cn/202.194.48.62 在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立连接。 有两个子类: Inet4Address, Inet6Address
  • 16. 3、InetAddress类1.获取Internet上主机的地址 静态方法 InetAddress.getByName(String s); //s是域名或IP地址 实例方法 public String getHostName() 获取域名。 public String getHostAddress() 获取IP地址。 2.获取本地机的地址 静态方法 InetAddress.getLocalHost(); //包含域名和IP地址 例子11-4 domainName.javaimport java.net.*; public class DomainName { public static void main(String args[]) { try { InetAddress address_1 = InetAddress.getByName("www.ldu.edu.cn"); System.out.println(address_1.toString()); InetAddress address_2 = InetAddress.getByName("www.computer.ldu.edu.cn"); System.out.println(address_2.toString()); InetAddress myIP = InetAddress.getLocalHost(); System.out.println(myIP.toString()); } catch (UnknownHostException e) { System.out.println("error !"); } } }www.ldu.edu.cn/202.194.48.62 www.computer.ldu.edu.cn/202.194.48.64 sl/202.196.5.8
  • 17. 4、Socket通信套接字 服务器端Socket 客户端Socket 通信过程 编程步骤 多线程处理
  • 18. 套接字(Socket)通信之前,TCP协议首先要在两台计算机之间建立连接 要建立连接的两端计算机称为“连接端” 一个套接字代表一个TCP连接的一个连接端,由IP地址和端口号的组成 Java将套接字抽象化为类,其中含有输入和输出流 java.net.Socket java.net.DatagramSocket
  • 19. 客户端和服务器网络通信的双方为客户端和服务器 客户 发起通信的一方常认为是客户端 使用java.net.Socket建立一个套接字 服务器 接收请求的一方则被认为是服务器 使用java.net.ServerSocket监听来自客户的连接 创建java.net.Socket对象与客户端连接192.168.0.118192.168.0.10网络A协议B协议
  • 20. 套接字套接字连接 客户端的套接字对象和服务器端的套接字对象通过输入、输出流连接在一起。服务器端Socket输入流输出流 连接 连接客户端Socket输出流输入流
  • 21. (1) 服务端socket的建立ServerSocket对象负责等待客户端请求建立套接字连接,类似邮局某个窗口中的业务员。 服务器必须事先建立一个ServerSocket对象,并绑定至正确的端口。 构造方法: ServerSocket(int port) ServerSocket(int port, int backlog, InetAddress bindAddr) try { ServerSocket listener = new ServerSocket(1880); Socket ss = listener.accept(); }catch(IOException e){}
  • 22. public Socket accept() throws IOException 等待客户机的连接请求,若连接,则创建一套接字 public void close() throws IOException 关闭服务器套接字 public boolean isClosed() 若服务器关闭成功则返回true public InetAddress getInetAddress() 返回与服务器套接字绑定的IP地址,若没有绑定则返回null public int getLocalPort() 获取服务器套接字监听的端口号
  • 23. (2) 客户端socket的创建Socket类的构造方法: Socket(InetAddress address,int port); Socket(String host,int port); try{ Socket clientSocket; clinetSocket = new Socket(“http://192.168.0.78”,1880); } catch(IOException e){}
  • 24. Socket常用方法public InputStream getInputStream() throws IOException 获取套接字的输入流 public OutputStream getOutputStream() throws IOException 获取套接字的输出流 public InetAdress getInetAddress() 获取被连接的服务器地址 public int getPort() 获取端口号
  • 25. (3)流连接套接字连接 客户端的套接字对象和服务器端的套接字对象通过输入、输出流连接在一起。服务器端Socket输入流输出流 连接 连接客户端Socket输出流输入流
  • 26. (5)编程步骤使用socket方式进行网络通信的四个主要步骤: 打开socket接口。 将特定的输入输出流连接到打开的socket。 按实际需要对socket进行读写操作。 关闭socket。 必须先启动服务器程序,再启动客户端程序 只要一方关闭连接,就会导致对方发生IOException 例子5:Client.java Server.java
  • 27. (4)通信过程Socket.close()OutputStream InputStreamServerSocket(port#) ServerSocket.accept()服务器Socket.close()OutputStream InputStreamSocket(host,port#) (attempt to connect)客户机注册服务等待连接
  • 28. 编程在网络通信的输入和输出流中,常用的类有: PrintWriter(输出流) BufferedReader (输入流) DataInputStream s=in.readUTF();//读取UTF-8形式的字符串 DataOutputStream out.writeUTF(s);//将s转换UTF-8字符串输出
  • 29. (本页无文本内容)
  • 30. (本页无文本内容)
  • 31. (6)使用多线程处理套接字连接服务器端收到一个客户的套接字后,就应该启动一个专门为该客户服务的线程。 例子6
  • 32. 串行化对象对于简单数据类型,DataInputStream和DataOutputStream可以解决问题 如果将简单类型组合为更复杂的结构,对象串行化可以解决这个问题 串行化允许将数据作为Java对象的状态来发送 例子:Request