流程圖如下:
Hello.java:
public interface Hello extends java.rmi.Remote {
//因為是跨網調用,所有申請時一定要拋出異常
String sayHello() throws java.rmi.RemoteException;
}
HelloClient.java:
import java.rmi.*;
import java.rmi.registry.*;
public class HelloClient {
public static void main(String args[]) {
/*
* Create and install a security manager
*/
/*getSecurityManager:
* 取得系統安全接口,如果當前應用程序已經建立安全應用管理器,那么就返回該安全管理器
* 否則就返回null
*/
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try {
/*getRegistry:
* Returns a reference to the the remote object <code>Registry</code> for
* the local host on the specified <code>port</code>.
*/
//打開一個注冊,端口號為2002
Registry registry = LocateRegistry.getRegistry(2002);
/*lookup:
* Returns the remote reference bound to the specified
* <code>name</code> in this registry.
*/
Hello obj = (Hello) registry.lookup("Hello");
String message = obj.sayHello();
System.out.println(message);
} catch (Exception e) {
System.out.println("HelloClient exception: " +
e.getMessage());
e.printStackTrace();
}
}
}
HelloImpl.java:
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RMIClientSocketFactory;
import java.rmi.server.RMIServerSocketFactory;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl
implements Hello
{
/*
* Constructs a HelloImpl remote object.
*/
public HelloImpl()
{
}
/*
* Returns the string "Hello World!".
*/
public String sayHello()
{
return "Hello World!";
}
public static void main(String[] args)
{
/*
* Create and install a security manager
*/
if (System.getSecurityManager() == null)
{
System.setSecurityManager(new SecurityManager());
}
byte pattern = (byte) 0xAC;
try
{
/*
* Create remote object and export it to use
* custom socket factories.
*/
HelloImpl obj = new HelloImpl();
RMIClientSocketFactory csf = new XorClientSocketFactory(pattern);
RMIServerSocketFactory ssf = new XorServerSocketFactory(pattern);
/*
* 使用一個由socket factory指定的轉換導出遠程對象,使它可以接收遠程輸入調用
* 導出遠程對象使它能夠接收輸入調用,使用由所給的socket工廠指定的轉換
* public static Remote exportObject(Remote obj, int port,
RMIClientSocketFactory csf,
RMIServerSocketFactory ssf)
*/
Hello stub =
(Hello) UnicastRemoteObject.exportObject(obj, 0, csf, ssf);
/*
* Create a registry and bind stub in registry.
*/
//開啟服務端口
LocateRegistry.createRegistry(2002);
//獲得服務端口
Registry registry = LocateRegistry.getRegistry(2002);
//創建一個名為Hello的綁定服務
registry.rebind("Hello", stub);
System.out.println("HelloImpl bound in registry");
}
catch (Exception e)
{
System.out.println("HelloImpl exception: " + e.getMessage());
e.printStackTrace();
}
}
}
XorServerSocketFactory.java:
import java.io.*;
import java.net.*;
import java.rmi.server.*;
public class XorServerSocketFactory
implements RMIServerSocketFactory {
private final byte pattern;
public XorServerSocketFactory(byte pattern) {
this.pattern = pattern;
}
public ServerSocket createServerSocket(int port)
throws IOException
{
return new XorServerSocket(port, pattern);
}
/*
* 一定要引用hashCode()及equals(Object obj)方法,因為這樣JAVA RMI引用將會
* 正確的與使用相應的SOCKET工廠的遠程導出對象分享資源
*/
public int hashCode() {
return (int) pattern;
}
public boolean equals(Object obj) {
return (getClass() == obj.getClass() &&
pattern == ((XorServerSocketFactory) obj).pattern);
}
}
XorClientSocketFactory.java:
public class XorClientSocketFactory
implements RMIClientSocketFactory, Serializable {
private final byte pattern;
public XorClientSocketFactory(byte pattern) {
this.pattern = pattern;
}
public Socket createSocket(String host, int port)
throws IOException
{
return new XorSocket(host, port, pattern);
}
public int hashCode() {
return (int) pattern;
}
public boolean equals(Object obj) {
return (getClass() == obj.getClass() &&
pattern == ((XorClientSocketFactory) obj).pattern);
}
}
XorServerSocket.java:
import java.io.*;
import java.net.*;
class XorServerSocket extends ServerSocket {
/*
* The pattern used to "encrypt" and "decrypt" each byte sent
* or received by the socket.
*/
private final byte pattern;
/*
* Constructor for class XorServerSocket.
*/
public XorServerSocket(int port, byte pattern) throws IOException {
super(port);
this.pattern = pattern;
}
/*
* Creates a socket of type XorSocket and then calls
* implAccept to wait for a client connection.
*/
public Socket accept() throws IOException {
Socket s = new XorSocket(pattern);
//調用父類ServerSocket中的方法,也可以不加super
//implAccept():ServerSocket的子類使用這個方法override accept()方法,
//這樣可以返回他們自己的子類SOCKET
super.implAccept(s);
return s;
}
}
XorSocket.java:
import java.io.*;
import java.net.*;
class XorSocket extends Socket {
/*
* The pattern used to "encrypt" and "decrypt" each byte sent
* or received by the socket.
*/
private final byte pattern;
/* The InputStream used by the socket. */
private InputStream in = null;
/* The OutputStream used by the socket */
private OutputStream out = null;
/*
* Constructor for class XorSocket.
*/
public XorSocket(byte pattern)
throws IOException
{
//繼承Socket類的所有屬性
super();
this.pattern = pattern;
}
/*
* Constructor for class XorSocket.
*/
public XorSocket(String host, int port, byte pattern)
throws IOException
{
//調用父類的方法,生成一個由指定主機的指定端口的SOCKET
super(host, port);
//這個pattern就是由用戶指定的一個加密參數
this.pattern = pattern;
}
/*
* Returns a stream of type XorInputStream. 重寫父類的getInputStream()方法
*/
public synchronized InputStream getInputStream() throws IOException {
if (in == null) {
in = new XorInputStream(super.getInputStream(), pattern);
}
return in;
}
/*
*Returns a stream of type XorOutputStream. 重寫父類的getOutputStream()方法
*/
public synchronized OutputStream getOutputStream() throws IOException {
if (out == null) {
out = new XorOutputStream(super.getOutputStream(), pattern);
}
return out;
}
}
XorInputStream.java:
import java.io.*;
class XorInputStream extends FilterInputStream {
/*
* The byte being used to "decrypt" each byte of data.
*/
private final byte pattern;
/*
* Constructs an input stream that uses the specified pattern
* to "decrypt" each byte of data.
*/
public XorInputStream(InputStream in, byte pattern) {
super(in);
this.pattern = pattern;
}
/*
* Reads in a byte and xor's the byte with the pattern.
* Returns the byte.
*/
public int read() throws IOException {
//調用父類的讀方法
int b = in.read();
//If not end of file or an error, truncate b to one byte
if (b != -1)
//進行異或運算
b = (b ^ pattern) & 0xFF;
return b;
}
/*
* Reads up to len bytes
*/
public int read(byte b[], int off, int len) throws IOException {
//調用父類的讀方法
int numBytes = in.read(b, off, len);
if (numBytes <= 0)
return numBytes;
for(int i = 0; i < numBytes; i++) {
//對讀入的每個字節都進行異或運算
b[off + i] = (byte)((b[off + i] ^ pattern) & 0xFF);
}
return numBytes;
}
}
XorOutputStream.java:
import java.io.*;
class XorOutputStream extends FilterOutputStream {
/*
* The byte used to "encrypt" each byte of data.
*/
private final byte pattern;
/*
* Constructs an output stream that uses the specified pattern
* to "encrypt" each byte of data.
*/
public XorOutputStream(OutputStream out, byte pattern) {
super(out);
this.pattern = pattern;
}
/*
* XOR's the byte being written with the pattern
* and writes the result.
*/
public void write(int b) throws IOException {
out.write((b ^ pattern) & 0xFF);
}
}
還有一個安全策略文件傳不上來
自已弄一個
這里還是把運行步聚寫下來:
編譯及運行程序
第一步:
javac *.java
第二步:對引用類運行rmic命令
rmic HelloImpl
第三步:運行服務端
java -Djava.security.policy=policy HelloImpl
正確運行你會看到下面的顯示
HelloImpl bound in registry
第四步:運行客戶端
java -Djava.security.policy=policy HelloClient
正常運行你會看到如下輸出
Hello World!
分享到:
相关推荐
1. **创建Bootstrap**:在服务器端,我们需要创建一个Bootstrap实例,并设置相应的参数,如Socket地址和端口,以及Channel工厂。Bootstrap的bind()方法用于启动监听服务。 2. **定义ChannelPipeline**:...
(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
- **Hello World程序**:通过编写第一个Java程序来熟悉Java的基本语法结构。 - **数据类型与变量**:讲解Java中的基本数据类型(如int、double等)以及如何声明变量。 - **运算符**:包括算术运算符、关系运算符、...
(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
3. ** HelloWorld程序**:初识Java,编写第一个"Hello, World!"程序,理解编译和运行过程。 4. **基本语法**:包括数据类型(整型、浮点型、字符型、布尔型)、变量、常量、运算符的使用。 5. **流程控制**:条件...
1. **Java基础**:Java的安装与配置、 HelloWorld程序、变量、数据类型、运算符、流程控制(if、switch、for、while)、数组和字符串的使用。 2. **面向对象编程**:类与对象的概念、封装、继承、多态,以及接口的...
(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
4. **第4章**:可能涵盖异常处理,如try-catch-finally语句块,自定义异常,以及如何在程序中有效地捕获和处理错误。 5. **第5章**:可能会介绍Java的IO流,包括文件操作,字节流与字符流,以及缓冲区和过滤流的...
13. **网络编程**:学习Socket编程,包括TCP和UDP通信,以及ServerSocket和Socket类的使用。 14. **反射机制**:掌握如何在运行时动态获取类的信息,以及创建和调用类的对象。 15. **注解(Annotation)**:理解注解...
6. **网络编程**:Java的Socket编程允许创建网络应用程序。例如,构建一个简单的TCP聊天室,可以让学习者理解客户端和服务器之间的交互。 7. **设计模式**:Java中的设计模式,如单例模式、工厂模式、观察者模式等...
3. **基础语法**:从简单的 HelloWorld 程序开始,讲解变量、数据类型、运算符、流程控制(如if-else、switch、循环)等基本概念。 4. **类与对象**:这是面向对象编程的核心,教程会详细解释类的定义、对象的创建...
(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,但是它的主要作用是供程序使用的。本规范尝试满足...
2. **环境搭建**:介绍如何配置Java开发环境,包括JDK的安装、环境变量设置以及Java HelloWorld程序的编写和运行。 3. **数据类型与变量**:深入探讨Java的两种数据类型(基本类型和引用类型)以及变量的声明、初始...
学习者可以学习如何使用FileInputStream、FileOutputStream、BufferedReader、PrintWriter等类进行文件操作,以及如何使用Socket编程进行网络通信。 7. **多线程**:Java提供了丰富的多线程支持,包括Thread类和...
- **HelloWorld**:这是每个编程语言学习者的入门程序,展示了如何在Java中输出一句话。 - **变量与数据类型**:可能包括整型、浮点型、字符型、布尔型的声明和使用。 - **运算符**:如算术、比较、逻辑和位...
10. **网络编程**:书中也会涉及Java的网络编程,讲解Socket通信和HTTP协议,为开发网络应用程序打下基础。 11. **设计模式**:作为标签提到的一个主题,设计模式是软件开发中的重要实践。书中可能介绍了单例模式、...
4. **第一个Java程序**:通过编写“Hello World”程序来演示Java程序的基本结构和运行流程,帮助初学者快速上手。 5. **基本数据类型与控制结构**:讲解Java中的基本数据类型(如整型、浮点型等),以及条件语句...