Java程序开发学习之网络编程

(学习参考书:Java2实用教程第5版)

一、URL类

URL类是java.net包中的一个重要的类。使用URL创建对象的应用程序称为客户端程序。一个URL对象封装着一个具体资源的引用。客户利用URL对象访问URL中的资源。
一个URL对象包含最基本的三部分信息:协议、地址和资源。协议是URL对象所在的JVM支持的协议;地址是必须能连接的有效的IP或域名;资源可以是主机上的任何一个文件。
(1)URL的构造方法

public URL(String spec) throws MalformedURLException; 使用字符串初始化一个URL对象,协议地址资源都包含在字符串内。
public URL(String protocol,String host,String file) throws MalformedURLException; 该方法使用的协议、地址、资源分别由三个参数依次指定

(2)读取URL中的资源
URL对象调用InputStream openStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流,可以将服务器的资源读入到客户端。

二、InetAddress类

Internet上的主机有两种方式表示地址:域名和IP地址
java.net包中的InetAddress类对象含有一个Iternet主机地址的域名和IP地址。

(1)获取Internet上主机的地址
可以使用InetAddress类的静态方法getByName(String s)将一个域名或 IP地址传递给方法的参数s,获得一个InetAddress对象,该对象以以下格式表示它包含的信息:www.sina.com.cn/202.108.37.40
该类还有两个实例方法:

public String getHostName() 获取对象所在的域名
public String getHostAddress() 获取对象所含的IP地址

(2)获取本地机的地址
使用InetAddress类的静态方法getLocalHost()获得一个对象,包含本地机器的域名和IP地址。

三、套接字

网络通信使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程(程序)。端口号规定为一个16位0~65535之间的整数。其中0至1023被预先定义的服务通信占用。
当两个程序需要通信时,可以通过使用Socket类建立套接字对象并连接在一起。(端口号与IP地址组合得出一个网络套接字)
(1)客户端套接字
Socket的构造方法为:

Socket socket = new Socket(String host,int port) throws IOException

因为建立套接字对象可能发生异常,因此建立要在try-catch语句中。
当套接字对象建立后,该对象可以调用getInputStream()获得一个输入流,这个输入流的源和服务器端的一个输出流的目的地刚好相同。该对象调用getOutputStream()方法得到一个输出流,这个输出流的目的地与服务器端的一个输入流的源刚好相同。如此以来读取写入数据。

(2)ServerSocket对象与服务器端套接字
客户负责建立连接到服务器的套接字对象,即客户负责呼叫。为了使客户成功地连接到服务器,服务器必须建立一个ServerSocket对象,该对象通过将客户端的套接字和服务器端的一个套接字对象连接起来,从而达到连接的目的。构造方法:

ServerSocket(int port) throws IOException;

port是一个端口号,必须与客户呼叫的端口号相同。当建立ServerSocket对象时可能发生异常,因此在建立在try-catch中完成。当ServerSocket对象建立后,就可以调用方法accept()将客户端的套接字和服务器端的套接字连接起来。
所谓接收客户端的套接字是指服务器端的ServerSocket对象调用accept()方法会返回一个和客户端Socket对象相连接的Socket对象。

服务器端的套接字对象调用getInetAddress()方法可以获取一个InetAddress对象,该对象包含客户端的IP地址和域名。客户端的套接字对象调用getInetAddress()方法可以获取一个InetAddress对象,该对象包含服务器端的IP地址和域名。

(3)使用多线程技术
使用套接字连接时,容易阻塞本线程,因此,服务器端收到一个客户端的套接字后,就应该启动一个专门为该客户服务的线程。
可以用Socket类的不带参数的构造方法创建一个套接字对象,该对象再调用public void connect(SocketAddres endpoint) throws IOExption请求和参数指定地址的服务器端的套接字建立连接。为了使用connect方法,可以使用SocketAddress的子类InetSocketAddress创建一个对象,该类的构造方法是

public InetSocketAddress(InetAddress addr,int port)

在套接字通信中,有两个基本原则:

  • A:服务器应当启动一个专门的线程,在该线程中和客户的套接字建立连接

  • B:由于套接字的输入流在读取信息时可能发生阻塞,客户端和服务器端都需要在一个单独的线程中读取信息。

四、UPD数据报

套接字是基于TCP协议的网络通信,即客户端程序和服务器端程序是有连接的。
基于UDP协议的通信与基于TCP协议的通信不同,基于UDP通信的信息更快,但不提供可靠性保证。因此在需要以较快速度传输信息,且能容忍小错误时,使用该协议。基于UDP通信的基本模式是:

  • 将数据打包,称为数据包,然后将数据包发往目的地。
  • 接受发来的数据包,然后查看数据包中的内容。

(1)发送数据包
用DatagramPacket类将数据打包,该类创建的对象称为数据包。创建待发送的数据包有以下两个构造方法:

DatagramPacket(byte[] data,int length,InetAddress address,int port) data数组是指定的数据,数据包发送的地址是address,端口是port
DatagramPacket(byte[] data,int offset,int length,InetAddress address,int port) 创建的数据包含有data数组从offset开始后的length个字节。

用DataSocket类的不带参数的构造方法创建的对象调用send(DataSocket sc)负责发送数据包

(2)接收数据包
用DataSocket类带参数的构造方法DataSocket(int port)创建一个对象,参数和待接收的数据包的端口号相同。
创建后的对象使用receive(DatagramPacket pack)接收数据包。

五、广播数据报

有一类特殊的IP地址称为D类地址。D类地址不用于代表位置,因此在网络上无法使用D类地址查找计算机。
要广播或接受广播的主机都必须加入到同一个D类地址。一个D类地址也被称为一个组广播地址。一个具有A,B,C类地址的主机要广播数据或接受广播数据都要加入到同一个D类地址。

六、Java远程调用

Java远程调用(RMI)是一种分布式技术,使用RMI可以让一个虚拟机上的应用程序请求调用位于网络上的另一处的虚拟机上的对象。发出调用请求的称为客户机,接受并执行请求的称为服务器。
(1)远程对象及其代理
驻留在服务器上的对象是客户要请求的对象,称为远程对象。RMI不希望用户程序直接与远程对象交流,而是让用户程序与远程对象的代理交流。代理的特点是:它与远程对象实现了相同的接口,即与远程对象公开了相同的方法。
RMI会帮助生成一个存根(Stub):一种特殊的字节码,并让这个存根产生的对下个作为远程对象的代理。代理需要驻留在客户端,即需要将存根复制或下载到客户端。
RMI为了标识一个对象是远程对象,要求这个对象必须实现Remote接口。该接口中没有方法,仅仅起标识作用

(2)RMI的设计细节
为以便规定远程对象的哪些方法是客户端可以请求的方法,必须拓展Remote接口,即定义子接口。
创建远程对象的类必须要实现Remote接口。在远程服务器创建远程对象之前,RMI要求服务器必须首先启动注册rmiregistry,启动之后,服务器创建的远程对象才可以注册到rmiregistry管理的注册表中。
远程服务器使用Naming类的类方法rebind(String name,Remote obj)绑定一个远程对象到注册表中。参数name是URL格式,obj是远程对象。客户端使用Naming的类方法lookup(String name)返回一个远程对象代理,该参数必须和远程对象注册的name相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值