通过几段 Java 代码带你掌握 RPC
副标题[/!--empirenews.page--]
这整个过程可以用一句话概括:机器 A 通过网络与机器B建立连接,A 发送一些参数给 B,B 执行某个过程,并把结果返回给 A。 “在写代码之前,先说一个前置背景,假设我们有一个商品类: public class Product implements Serializable {
private Integer id; private String name;
public Product(Integer id, String name) { this.id = id; this.name = name; }
//toString()
//get set 方法 } 有一个商品服务接口: public interface IProductService {
Product getProductById(Integer id); } 服务端有商品服务接口的实现类: public class ProductServiceImpl implements IProductService { @Override public Product getProductById(Integer id) { //实际上这里应该去查询数据库获得数据,下面简化了 return new Product(id, "手机"); } } 下面我们通过客户端发送一个商品 id 到服务端,服务端获得 id 后通过商品服务类获取商品信息,返回给客户端: public class Client {
public static void main(String[] args) throws Exception { //建立Socket Socket socket = new Socket("127.0.0.1", 8888); //获取输出流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); //把商品Id通过网络传到服务端 dos.writeInt(123);
socket.getOutputStream().write(baos.toByteArray()); socket.getOutputStream().flush();
//读取服务端返回的商品信息 DataInputStream dis = new DataInputStream(socket.getInputStream()); Integer id = dis.readInt(); //商品id String name = dis.readUTF(); //商品名称 Product product = new Product(id, name);//通过服务端返回的商品信息生成商品
System.out.println(product);
//关闭流资源为了方便阅读,没有做try-catch处理 dos.close(); baos.close(); socket.close(); } }
public class Server { private static boolean running = true;
public static void main(String[] args) throws Exception { //建立服务端Socket ServerSocket ss = new ServerSocket(8888); //不断监听,处理客户端请求 while (running) { Socket socket = ss.accept(); process(socket); socket.close(); } ss.close(); }
private static void process(Socket socket) throws Exception { InputStream is = socket.getInputStream(); OutputStream os = socket.getOutputStream(); DataInputStream dis = new DataInputStream(is); DataOutputStream dos = new DataOutputStream(os);
//读取客户端发过来的id Integer id = dis.readInt(); //调用服务类生成商品 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |