// Java RPC 示例代码
import java.io.IOException;
import java.io.ObjectInputStream;
import import java.io.ObjectOutputStream;
import java.net.Socket;
// 定义一个简单的接口,用于远程调用
public interface HelloService {
String sayHello(String name);
}
// 实现该接口
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
return "Hello, " + name;
}
}
// 服务端代码
public class RpcServer {
private final int port;
public RpcServer(int port) {
this.port = port;
}
public void start() throws IOException {
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("服务器已启动,等待客户端连接...");
while (true) {
Socket socket = serverSocket.accept();
new Thread(new ServiceTask(socket)).start();
}
}
}
private static class ServiceTask implements Runnable {
private final Socket socket;
public ServiceTask(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream())) {
// 接收客户端请求的方法名和参数
String methodName = input.readUTF();
String argument = input.readUTF();
// 创建服务实例并调用相应方法
HelloService service = new HelloServiceImpl();
String result = service.sayHello(argument);
// 将结果返回给客户端
output.writeUTF(result);
output.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 客户端代码
public class RpcClient {
private final String host;
private final int port;
public RpcClient(String host, int port) {
this.host = host;
this.port = port;
}
public String callSayHello(String name) {
try (Socket socket = new Socket(host, port);
ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream input = new ObjectInputStream(socket.getInputStream())) {
// 发送要调用的方法名和参数
output.writeUTF("sayHello");
output.writeUTF(name);
output.flush();
// 接收服务端的响应
return input.readUTF();
} catch (IOException e) {
e.printStackTrace();
return "Error";
}
}
}
// 测试代码
public class Main {
public static void main(String[] args) throws IOException {
// 启动服务端
RpcServer server = new RpcServer(8080);
new Thread(() -> {
try {
server.start();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
// 模拟客户端调用
try {
Thread.sleep(1000); // 等待服务端启动
RpcClient client = new RpcClient("localhost", 8080);
String response = client.callSayHello("World");
System.out.println("Response from server: " + response);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
HelloService
是一个简单的接口,包含一个 sayHello
方法。HelloServiceImpl
类实现了 HelloService
接口。RpcServer
类负责监听客户端连接,并在接收到请求时调用相应的服务方法。它使用多线程处理多个客户端请求。RpcClient
类负责与服务端建立连接,发送方法调用请求,并接收响应。Main
类中包含了启动服务端和模拟客户端调用的代码。这个示例展示了如何通过 Java 实现一个简单的 RPC(远程过程调用)系统。
上一篇:java 自定义异常
下一篇:java socket编程
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站