1、第 21 章 Java 网络的基本知识本章重点介绍的 4 个重要的类:URL Socket InetAddres DatagramSocket21.1 使用 URL1、Internet 寻址Internet 上每台计算机通过 IP 地址+-地标识出来,IP 地址实际由 32 位二进制数组成,实际上表示成 3 个圆点间隔的 4 个 0255 的十进制数组成 eg 202.118.19.32 没 IP 就不能区分连在 Internet 上不同的计算机、域名好记(域名解析器 DNS)2、使用 URL 定位资源IP 地址惟一标识 Internet 上的计算机。URL 标识这些计算机上的资源,充当 一个
2、指向资源的指针URL:统一资源定位器:服务使用的协议计算机的域名地址资源(具体的网页)eg: http:/ 网络 API 提供的基本网络类,包含在 java net 包 URL 的(资源)构造方法public URL(String s)解释例子可在 applet 中连接到另外的 Web 页面getAppletContext().show Document(url)web 页面地址解释例子21.2 套接字1、套接字 Socket端口号标识正在计算机上运行的进程(065535)01023 预先定义的服务通信占用端口号与 IP 地址的组合得出一个网络套接字可以把套接字连接想象成“电话呼叫” 。呼叫的
3、一方为“客户” ,负责监听的一放是服务器。2、客户建立连接到服务器的套接字对象Socket 的构造方法:Socket(String host, int port) 服务器的 IP 端口号建立时可能发生 IOExceptioneg trySorket mysocket=new Socket(“http/192.168.0.78”,1880)catch (IOException e) mysocket 可用 getInputStream()方法获得一个输入流,然后用这个输入流读取服务器放入线路的信息,但不能读自己放入“线路”的信息mysocket 可用 getInputStream()方法获得一个
4、输出流,然后用这个输出流将信息写入线路实际编程时,把 mysocket 使用 getInputStream()获得的输入流接到另一个数据流,然后从这个数据流读服务器信息,把 mysocket 使用 getInputStream()获得的输出流接到另一个 DataOutputStream 数据流上,然后向这个数据流写入信息,发送服务器端,之所以这样是为了用数据流更好的输入/ 输出信息。3、ServerSocket 类ServerSocket( int port)必须与客户呼叫的端口号相同建立服务器套接字可能发生 IOException 建立了服务器套接字后可用accept()方法接收客户的套接字
5、连接呼叫,此过程也可能发生 IOException 异常服务器端的 Socket 对象使用 getOutputStream()获得的输出流将指向客户端Socet 对象使用 getInputStream()获得的输入流。注:从套接字连接中读数据与从文件读数据有很大的不同(数据是否提前已存在)accept()方法也会等待服务器端套接字对象调用 getInputStream()可获取一个 InetAddress 对象,其中含有客户端 IP 地址和域名;客户端套接字对象调用 getInputStream()可获得一个含有服务器端 IP 地址和域名的 InetAddress 对象双方通信完毕后应调用 c
6、lose()方法关闭套接字连接解释 图 21.14、把套接字连接放在一个线程中套接字连接中及到输入流和输出流操作,为了影响我们做其他的事情,应把套接字连接放在一个单独的线程中执行,服务器端收到客户的套接字会应启动一个专门为该客户服务的线程区别:小应用程序:客户端程序只能和它所驻留的服务器建立套接字连接应用程序:localhost 代表本地机 IP,可用个人 Wed 发布管理器(用wir98 安装盘可按装个人 wed 管理器)式 IIS 将服务器端含有 Java Applet 小程序的文件夹没有 wed 共享21.3 InetAddress 类Internet 上主机两种方式表示地址:(1)域名
7、:eg (2)IP 地址:eg :202.108.35.210DNS 负责将域名转换为 IP 地址1、获取 Internet 上主机的地址可用 InetAddress 类的静态方法 getByname(String s)将域名或 IP 传给 s,将该方法返回 1 个 InetAddress 对象,其中含有域名和 IP,格式如下:域名/IP例如: 中含有两个实例方法:Public String getHostName():获取 InetAddress 中所含的域名Public String getHostAddress():获取 InetAddress 中所含的 IP2、获取本地主机的地址用 I
8、netAddress 类的静态方法 getLocalHost()获得一个 InetAddress 对象,该对象含有本地主机的域名和 IP 地址21.4 UDP 数据报基于 UDP 的信息传递更快,但不提供可靠性保证,UDP 比作邮信,不能肯定所发信件一定收到,也不能肯定信件到达顺序与发出顺序一致。基与 UDP 通信的基本模式:(1) 将数据打包(数据包) 。热后将数据包发往目的地(2) 接收别人发来的数据包,然后查看数据包中内容1、发送数据包(1)用 DatagramPacket 类将数据打包DatagramPacket(byte data,int length ,InetAddress ad
9、dress, int port) 目标地址 目标端口号DatagramPacket(byte data ,int offset, int length, InetAddress address, int port)注:public int getPort()方法可获取该数据包目标端口号,public InetAddress getAddress()可获取数据包中的数据。用 DatagramSocket()创建一个对象,负责发送数据包eg DatagramSocket mail-out=new DatagramSocket()mail-out.send(data-pack)2、接收数据包(1)用
10、 DatagramSocket(int port)创建一个对象,其中 purt 必须与待接收的数据包端口号相同(2)使用 receive(DatagramPacket pack)方法接收数据包其中 DatagramPacket 构造方法为:DatagramPacket(bytedata ,int length )注:1、receive 方法阻塞等待2、数据包长度不超过 8192K133、始发端口号,始发地址解释例子21.5 广播数据包IP 地址的分类:a128 (b.c.d 表示主机) A 类地址128a 192 (a.b 表示网络地址, c.d 表示主机地址) B 类地址192a: (a.b.c 网络地址 d 主机地址) C 类地址224.0.0.0224.255.255.255 (保留地址) D 类地址要广播或接收广播的主机必须加入到同一个 D 类地址,一个 D 类地址称做一个广播组,加入同一广播组的主机可在端口上广播信息,也可在某端口上接收信息。注:多点广播套接字:MulticastSocket 类创建补充:一个 URL 对象可用 openStream()获得一输入流,然后用这个输入流读取 URL 对象处的资源。