hadoop18---socket实现rpc

Posted 672530440

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hadoop18---socket实现rpc相关的知识,希望对你有一定的参考价值。

客户端:

package cn.itcast_04_reflect.socket;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class TestClient {
    public static void main(String[] args) throws Exception {
        
        Socket socket = new Socket("localhost", 9898);
        OutputStream out = socket.getOutputStream();
        InputStream in = socket.getInputStream();
        
        PrintWriter pw = new PrintWriter(new BufferedOutputStream(out));
        pw.println("cn.itcast_04_reflect.rpc.TestBusiness:getPrice:yifu");
        pw.flush();
        
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String readLine = br.readLine();
        
        System.out.println("client get result: " + readLine);
        
        socket.close();
    }
}
package cn.itcast_04_reflect.socket;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.lang.reflect.Method;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class TestServerTask implements Runnable{
    private Socket socket;
    public TestServerTask(Socket socket){
        this.socket = socket;
    }
    
    @Override
    public void run() {
        InputStream in;
        OutputStream out;
        try {
            in = socket.getInputStream();
            out = socket.getOutputStream();
            
            BufferedReader br = new BufferedReader(new InputStreamReader(in));//一次读一行,客户端的消息要带回车符。
            String request=null;
            while((request = br.readLine())!=null) {
                request = br.readLine();
            }
            String[] split = request.split(":");
            String className = split[0];
            String methodName = split[1];
            String methodParam= split[2];
            
            Class<?> forName = Class.forName(className);
            System.out.println("calling class: " + forName);
            Object newInstance = forName.newInstance();
            Method method = forName.getMethod(methodName,String.class);
            System.out.println("calling method: " + method);
            Object invoke = method.invoke(newInstance, methodParam);
            System.out.println("results: " + (int)invoke);
            
            
            PrintWriter pw = new PrintWriter(new BufferedOutputStream(out));
            pw.println((int)invoke);
            pw.flush();
            
            br.close();
            pw.close();
            socket.close();
            
        } catch (Exception e) {
             
            e.printStackTrace();
        }
        
    }

    
    
    public static void main(String[] args) throws Exception {
        ServerSocket server = new ServerSocket();
        server.bind(new InetSocketAddress("localhost",9898));
        while(true){
            Socket socket = server.accept();
            new Thread(new TestServerTask(socket)).start();
        }
    }
}




public interface IBusiness {
    public int getPrice(String good);
}


public class TestBusiness implements IBusiness{
    @Override
    public int getPrice(String good){
        return good.equals("yifu")?10:20;
    }
}

 

以上是关于hadoop18---socket实现rpc的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop RPC通信机制

Hadoop RPC机制中Server类的实现:基于Java NIO

Hadoop RPC机制中Server类的实现:基于Java NIO

Hadoop RPC机制中Server类的实现:基于Java NIO

3 weekend110的hadoop中的RPC框架实现机制 + hadoop中的RPC应用实例demo

2018-07-23期 Hadoop RPC模拟NameNode