上一份学习报告写完之后,拖了两天缓了缓。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Java网络编程
(1)URL类
Java使用URL创建对象的应用程序称为客户端程序。一个URL对象封装着一个具体的资源的引用,客户可以通过利用URL对象获取URL中的资源。一个URL对象包括最基本的三部分信息:协议、地址、资源。协议是URL对象所在的Java虚拟机支持的协议,常用的Http、Ftp、File协议都是虚拟机支持的协议。地址必须是能连接的有效的IP地址或域名;资源则是主机上任何一个文件。
URL类构造方法: public URL (String spec) throws MalfformedURLException 其中spec是虚拟机支持的协议格式的地址,例
try{URL url = new URL("http://www.google.com");
}
catch(MalfformedURLException e){
System.out.println("bad URL:"+url);
}
(2)InetAddress类
主要作用是作为其他的方法使用的参数,使用例子
import java.net.*;
public class Example13_2 {
public static void main(String args[]) {
try{ InetAddress address_1=InetAddress.getByName("www.sina.com.cn");
System.out.println(address_1.toString());
InetAddress address_2=InetAddress.getByName("166.111.222.3");
System.out.println(address_2.toString());
}
catch(UnknownHostException e) {
System.out.println("无法找到 www.sina.com.cn");
}
}
}
(3)套接字
网络通信使用IP地址标识Internet上的计算机,使用端口号标识服务器上的进程。反过来说,加入服务器上一个程序不占用一个端口号,用户程序就无法找到它,无法与该程序交互信息。通常我们使用1024~65535号端口进行通信,避免端口冲突。
若两个程序需要通信时,我们可以使用Socket类建立套接字对象并连接在一起(端口号与IP地址组合得到一个网络套接字)
构造方法是Socket(String host,int port),host是服务器IP地址,port是端口号,建立套接字对象可能会发生IOException异常,所以要使用try-catch语句捕获异常。
客户负责建立连接到服务器的套接字对象,即客户负责呼叫。相对的服务器应当建立一个ServerSocket对象,与客户端的套接字对象连接起来,从而达到连接的目的。构造方法是ServerSocket(int port),port是端口号,同样使用try-catch语句捕获异常
当服务器的ServerSocket对象Serverclient建立后,就可以使用方法accept()将客户端和服务器端的套接字连接起来,代码如下
try{Socket sc = Serverclient.accept();
}
catch(IOException e){}
这个sc对象会驻留在服务器端,调用getOutputStream()获得的输出流将指向客户端对象的输入流,反之亦然,如此达到交互的目的。,与从文件中读取数据不同,可能在另一端数据发送之前,就已经开始读取了,因此会阻塞本线程,直到该读取方法成功读取到信息,本线程才继续执行后续操作。
为此,我们可以使用多线程技术,启动一个专门为该客户服务的线程。可以用Socket类的不带参数的构造方法创建一个套接字对象,再调用public void connect(SocketAddress endpoint)throws IOException请求和参数SocketAddress指定地址的服务器端的套接字建立连接。为使用connect方法,可以使用SocketAddress的子类InetSocketAddress创建一个对象,构造方法是public InetSocketAddress(InetAddress addr,int port)
(4)UDP数据报
套接字是基于TCP协议的网络通信,UDP数据报则基于UDP协议,它的信息传递更快,但不提供可靠性保证。在数据传输过程中,用户无法知道数据能否正确到达目的地主机,也不能确定数据达到目的地的顺序是否和发送的顺序相同。UDP需要将数据打包,再发送。,用DatagramPacket类将数据打包。接收数据时,先用DatagramPacket(int port)创建对象,其中参数与待接收的数据包端口号相同,然后用该对象调用方法receive(DatagramPacket pack)接收数据包。方法receive把收到的数据包传给参数pack,因此要准备一个数据包以便接收数据包,调用DatagramPacket类的另外一个构造方法DatagramPacket(byte data[],int length)创建一个数据包。该数据包将接收长度是length个字节的数据放入data。
(5)广播数据报
Internet的地址是a.b.c.d的形式,根据a的大小划分地址类别,224.0.0.0~239.255.255.255是保留地址,称作D类地址。要广东货接收广播的主机必须加入到同一个d类地址。给出例子
import java.net.*;
public class BroadCast {
String s="国庆放假时间是9月30日";
int port=5858; //组播的端口
InetAddress group=null; //组播组的地址
MulticastSocket socket=null; //多点广播套接字
BroadCast() {
try {
group=InetAddress.getByName("239.255.8.0");//设置广播组的地址为239.255.8.0
socket=new MulticastSocket(port); //多点广播套接字将在port端口广播
socket.setTimeToLive(1); //多点广播套接字发送数据报范围为本地网络
socket.joinGroup(group); //加入group后,socket发送的数据报被group中的成员接收到
}
catch(Exception e) {
System.out.println("Error: "+ e);
}
}
public void play() {
while(true) {
try{ DatagramPacket packet=null; //待广播的数据包
byte data[]=s.getBytes();
packet=new DatagramPacket(data,data.length,group,port);
System.out.println(new String(data));
socket.send(packet); //广播数据包
Thread.sleep(2000);
}
catch(Exception e) {
System.out.println("Error: "+ e);
}
}
}
public static void main(String args[]) {
new BroadCast().play();
}
}
import java.net.*;
import java.util.*;
public class Receiver {
public static void main(String args[]) {
int port = 5858; //组播的端口
InetAddress group=null; //组播组的地址
MulticastSocket socket=null; //多点广播套接字
try{
group=InetAddress.getByName("239.255.8.0");//设置广播组的地址为239.255.8.0
socket=new MulticastSocket(port); //多点广播套接字将在port端口广播
socket.joinGroup(group); //加入group
}
catch(Exception e){}
while(true) {
byte data[]=new byte[8192];
DatagramPacket packet=null;
packet=new DatagramPacket(data,data.length,group,port); //待接收的数据包
try { socket.receive(packet);
String message=new String(packet.getData(),0,packet.getLength());
System.out.println("接收的内容:\n"+message);
}
catch(Exception e) {}
}
}
}
(6)Java远程调用
Java远程调用(RMI)是一种分布式技术,使用RMI可以让一个虚拟机上的应用程序请求调用位于网络上另一处虚拟机上的对象。习惯上将发出请求的虚拟机称为(本地)客户机,接收并执行的为(远程)服务器。
首先,RMI不希望客户应用程序直接与远程对象交互,取而代之让程序与远程对象的代理打交道。代理的特点是,它与远程对象实现了相同的接口,向用户公开了相同的方法。RMI会生出一个存根(Stub):一种特殊的字节码。这个存根产生的对象作为远程对象的代理。代理会驻留在客户端,就是说,用户需要把RMI生成的存根复制或下载到客户端。
RMI为了标识一个对象时远程对象,要求远程对象必须实现java.rmi包中的Remote接口。该接口没有方法,仅仅是一个标识作用,用户不必编写和远程代理有关得到代码,只需知道远程代理和远程对象实现了相同的接口。
在远程服务器创建远程对象之前,RMI要求远程服务器首先启动注册rmiregistry。注册后远程服务器就可以启动远程对象服务,级变成程序来创建和注册远程对象,并运行该程序
import java.rmi.*;
public class BindRemoteObject{
public static void main(String args[]){
try{
RemoteConcreteSubject remoteObject=new RemoteConcreteSubject();
Naming.rebind("rmi://127.0.0.1/rect",remoteObject);
System.out.println("be ready for client server...");
}
catch(Exception exp){
System.out.println(exp);
}
}
}
学习过程遇到的问题
有所疑惑
敲代码遇到的问题
慢慢思索
代码行数 | 博客量 | 学习时长 | |
第一周 | 53 | 1 | 3 |
二 | 186 | 1 | 5 |
三 | 134 | 1 | 4 |
五 | 233 | 1 | 6 |
六 | 425 | 1 | 9 |
七 | 202 | 1 | 5 |
八 | 62 | 1 | 4 |
九 | 176 | 1 | 7 |
十 | 130 | 0 | 6 |
十一 | 56 | 1/9 | 8 |
十二 | 442/2073 | 2/11 | 14/71 |