第十三章Java网络编程

13.1 URL类
URL的实例封装着一个统一资源定位符(Uniform Resource Locator,URL),使用URL创建对象的应用程序称为客户端程序
一个URL对象封装着一个具体的资源的引用,表明客户要访问这个URL中的资源,客户利用URL对象可以获取URL中的资源
URL类通常使用如下的构造方法创建一个URL对象:
——public URL(String spec)throws MalformedURLException
——public URL(String protocol,String host,String file)throws MalformedURLException
1.URL的构造方法:URL对象通常包含三部分信息:协议、地址、资源
try {
URL url =new URL(“http://www.google.com”);
}
catch(MalformedURLException e) {
System.out.println(“Bad URL:”+url);
}
url对象中的协议是http协议,即用户按着这种协议和指定的服务器通信,url对象包含的地址是www.google.com,所包含的资源是默认的资源(主页)
2.读取URL中的资源:URL对象调用InputStream openStream()方法可以返回一个输入流,该输入流指向URL对象所包含的资源,通过该输入流可以将服务器上的资源信息读入到客户端

13.2 InetAddress类
1.地址的表示:我们知道Internet上的主机有两种方式表示地址:(1)域名,例如:www.tsinghua.edu.cn(2)IP地址,例如:202.208.35.210
InetAddress类对象含有一个Internet主机地址的域名和IP地址:www.sina.com.cn/202.108.37.40
2.获取地址:InetAddress类的静态方法:getByName(String s);将一个域名或IP地址传递给该方法的参数s,获得一个InetAddress对象,该对象含有主机地址的域名和IP地址,该对象用如下格式表示它包含的信息:www.sina.com.cn/202.108.37.40

13.3 套接字
1.套接字:当两个程序需要通信时,它们可以通过使用Socket类建立套接字对象并连接在一起(端口号与IP地址的组合得出一个网络套接字)
2.客户端套接字:客户端的程序使用Socket类建立负责连接到服务器的套接字对象
try {
Socket clientSocket = new Socket(“http://192.168.0.78”,2010);
}
Catch(IOException e){}
与mysocket相关的方法:
——getInputStream()获得一个输入流
——getOutputStream()获得一个输出流
——用getInputStream()得到的输入流接到另一个DataInputStream数据流上
——用getOutputStream()得到的输出流接到另一个DataOutputStream数据流上
3.ServerSocket对象与服务器套接字(如图):
try { ServerSocket serverForClient =new ServerSocket(2010);
}
Catch(IOException e){}
try {
Socket sc =serverForClient.accept();
OutputStream outServer = sc.getOutputStream
}
Catch(IOException e){}
第十三章Java网络编程_第1张图片
套接字连接示意图如下图所示
第十三章Java网络编程_第2张图片
4.使用多线程(如图)
第十三章Java网络编程_第3张图片
服务器端收到一个客户的套接字后,就应该启动一个专门为该客户服务的线程
使用套接字连接时,可能在另一端数据发送出来之前,就已经开始试着读取了,这时就会堵塞本线程,直到该读取方法成功读取到信息,本线程才继续执行后续的操作

13.4 UDP数据报
基于UDP的通信和基于TCP的通信不同,基于UDP的信息传递更快,但不提供可靠性保证
基于UDP通信的基本模式是:
1.将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地
2.接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容

4.1发送数据包
1.用DatagramPacket类将数据打包,即用DatagramPacket类创建一个对象,称为数据包,用DatagramPacket的以下两个构造方法创建待发送的数据包:
——DatagramPacket(byte data[ ],int length,InetAddress address,int port)
——DatagramPacket(byte data[ ],int offset,int length,InetAddress address,int port)

2.用DatagramSocket类的不带参数的构造方法:DatagramSocket()创建一个对象,该对象负责发送数据包,例如:
——DatagramSocket mail_out = new DatagramSocket();
——mail_out.send(data_pack);

4.2 接收数据包
1.首先用DatagramSocket的另一种构造方法DatagramSocket(int port)创建一个对象,其中的参数必须和待接收的数据包的端口号相同,例如:如果发送方发送的数据包的端口号是5666,那么如下创建DatagramSocket对象:——DatagramSocket mail_in = new DatagramSocket(5666);
2.然后对象mail_in使用方法receive(DatagramPacket pack)接收数据包
3.用DatagramPacket类的另外一个构造方法:DatagramPacket(byte data[ ],int length)创建一个数据包,用于接收数据包,例如:
byte data[ ] = new byte[100];
Int length = 90;
DatagramPacket pack = new DatagramPacket(data,length);
Mail_in.receive(pack);
——该数据包pack将接收长度是length字节的数据放入data

13.5 广播数据报
广播数据报涉及到地址和端口
广播数据报是一种较新的技术,要广播或接收广播的主机都必须加入到同一个D类地址,一个D类地址也称作一个组播地址,D类地址并不代表某个特定主机的位置,一个具有A、B或C类地址的主机要广播数据或接收广播,都必须加入到同一个D类地址
广播端(BroadCast.java) 接收端(Receiver.java)
具体内容如下图所示
第十三章Java网络编程_第4张图片

13.6 Java远程调用(RMI)
RMI可以让一个虚拟机上的应用程序请求调用位于网络上另一处虚拟机的对象。习惯上称发出调用请求的虚拟机为(本地)客户机,称接受并执行请求的虚拟机(远程)服务器
1.远程对象及其处理
(1)远程对象:编写一个UnicastRemoteObject的子类,该子类必须实现Remote(代码如下图所示)
第十三章Java网络编程_第5张图片
(2)代理与存根(Stub):rmiregistry(关系图如下图所示)
第十三章Java网络编程_第6张图片
2.启动注册:rmiregistry
3.启动远程对象服务(代码如下图所示)
在这里插入图片描述
4.运行客户端程序
RMI的设计细节(具体内容如下图所示)
第十三章Java网络编程_第7张图片

你可能感兴趣的:(第十三章Java网络编程)