一、java.net包中的URL类用于获取网络主机中的资源。其对象调用openStream()方法可以返回一个输入流,其输入流的数据源就是URL对象中封装的目的主机中的网络资源文件中的数据。其使用方法如:
①URL url=new URL(“url地址”);
②InputStream in=url.openStream();
③in.read(字节数组); //每次读取数据量不固定通常是512个字节
二、InetAddress类用于获取目标主机的域名和IP地址。其用法如下:
①InetAddress address=new InetAddress.getByName(“域名或IP地址”); //其对象中封装着目的主机的域名和IP
②address.getHostName() //获取主机名
address.getHostAddress() //获取主机IP
③InetAddress address=InetAddress.getLocalHost() //用于获取本机域名和IP地址
三、套接字用于实现不同程序之间基于TCP的网络通信。位于不同主机上的程序通过创建各自的套接字对象并将其连接在一起就可以实现不同程序之间的网络通信。发送请求连接的一方通常为客户端、对请求做出响应的一方为服务端。其实现过程通常如下:
①创建客户端套接字对象(期间会向服务端发起连接请求)。
Socket client=new Socket(“目的地址或域名”,”目的端口号”)
#获取服务端发送给本客户端的消息。
DataInputStream in=new DataInputStream(client.getInputStream()) //获取指向服务端输出流所在目的地的输入流client.getInputStream()。
String message=in.readUTF() //等待阻塞,读取服务端发送的消息
#客户端发送消息到服务端。
DataOutputStream out=new DataOutputStream(client.getOutputStream()) //获取指向服务端输入流源的输出流client.getOutputStream()
out.writeUTF(“字符串”) //向服务端发送消息
②创建服务端套接字对象
ServerSocket server=new ServerScoket(服务端口号)
#阻塞等待接收客户端的连接请求,并返回双方已建议连接用于互相通信的套接字对象。
Socket scon=server.accept(); //服务端使用此套接字对象可以获取输入和输出流,从而接收或发送消息给客户端。
scon.getInetAddress() //用于获取客户端的域名和IP地址
scon.getPort() //获取客户端的端口号
说明:使用多线程技术就是服务端为每个已连接过来的客户端分别创建一个线程专每用于双方的通信。其原则如下:
2.1服务端专门启动一个线程用于和客户端的套接字进行消息的传输。
2.2 客户端和服务端都需在一个线程中读取消息,以免读取的阻塞影响后续其它代 码的执行。
四、基于UDP的不同程序之间的网络通信过程通常如下:
发送数据包:
#创建要发送的数据包对象
DatagramPacket data_packet=new DatagramPacket(字节数,数据开始下标,发送的字 节数,目的主机InetAddress类对象,目的端口号)
#创建UDP套接字对象,并发送数据包
DatagramSocket socket=new DatagramSocket();
socket.send(数据包对象);
接收数据包:
#创建udp套接字对象并指定服务端的端口号
DatagramSocket socketServer=new DatagramSocket(接收端口号)
#套接字对象调用receive(保存接收到数据的数据包对象)方法接收数据包
socketServer.receive(pack)。 //需创建DatagramPacket类的包对象pack用于接收数据
五、广播(组播)数据报用于在一个计算机组群中发送或接收数据,其发送方和接收方必须加入到同一个组播组IP地址中才能发送或接收组播组中的数据。其组播源发送的数据包是基于UDP的通信方式,其发送的数据包含有【源单播IP,目的组播IP,源端口号,目的端口号】。
其实现过程通常如下:
广播源:
①创建组播套接字对象并指定源端口号
MulticastSocket socket=new MulticastSocket(源端口号)
socket.setTimeToLive(int) //设置广播数据包ttl的值。
②加入组播组,并指定使用网卡接口
socket.joinGroup(InetSocketAddress类的对象(组播IP),NetworkInterface类的接口对象) //其中第一个参数用于指定要加入的组播组IP地址;第二个参数指定使用主机的那个网 卡接口用于发送组播数据包。
③泛洪发送组播数据包
socket.send(DatagramPacket类的数据包对象); //数据包对象中包含发送数据包中的目 的组播IP和目的端口号。
组播组成员:
①创建组播套接字对象并指定接收组播数据包的端口号
MulticastSocket socket=new MulticastSocket(接收端口号) //端口号须于接收数据包的 目的端口号一致
②加入组播组,并指定接收数据包的网卡接口
socket.joinGroup(InetSocketAddress类的对象(组播IP),NetworkInterface类的接口对象)
③阻塞等待接收组播源发送的数据包
socket.receive(pack) //需创建DatagramPacket类的包对象pack用于接收数据
六、Java远程调用(RMI)机制用于实现对象方法的远程调用。即客户端可以通过网络请求获取服务端已注册启动的远程对象的引用,然后客户端就可以通过获取到的远程对象引用来调用其远程对象中的方法并将调用方法的请求发送给服务端,服务端接收到请求后会在自己的JVM中调用执行用户请求的方法,然后在将执行返回的结果发送给客户端程序。
说明:服务端将实现Remote接口的类的对象视为远程对象,只有是远程对象才能被客户端网络远程调用。其实现过程通常如下:
远程对象服务端:
①扩展Remote接口并定义抽象方法,即创建Remote的子接口。用于规定远程对象中可以被客户端远程调用的方法。
②创建远程对象的类,并继承java.rmi.server包中的UnicastRemoteObject类和实现Remote的子接口。
③启动rmiregistry。在命令行窗口项目目录下使用“start rmiregistry”命令,只有开启了此程序后远程对象才能将自己注册到rmiregistry所管理的注册表中,进而才能被客户端远程调用。
④创建主类启动远程对象服务。在main()方法中创建远程对象,并使用java.rmi包中Naming类的静态方法Naming.rebind(“rmi://服务端IP地址”,远程对象)将远程对象绑定到rmiregistry所管理的注册表中。至此远程对象服务程序就创建好了,用户只需执行此程序便启动了远程对象服务。
客户端:
①客户端使用Naming.lookup(“rmi://服务端IP地址”)方法向服务端发起请求获取远程对象引用并以Remote接口类型的方法返回。
②客户端使用强制类型转换,将获取到的远程对象引用转化为Remote的子接口类型,以此客户端便可使用此远程子接口对象来回调服务端远程对象中的方法,并将服务端的执行结果返回本客户端。
注意:客户端必须先获取到服务端远程对象的子接口java的字节码文件后,才能执行客户端程序,因为在客户端程序中将获取到的远程对象引用转化为了其子接口类型即使用到了远程对象的子接口。
@声明:“山月润无声”博主知识水平有限,以上文章如有不妥之处,欢迎广大IT爱好者指正,小弟定当虚心受教!