标签:blog http io ar os 使用 sp java for
package mavshuang.rpc;
import org.apache.hadoop.ipc.VersionedProtocol;
public interface MyBizable extends VersionedProtocol {
public static final long VERSION = 123456L;
public abstract String hello(String name);
}package mavshuang.rpc;import java.io.IOException;
public class MyBiz implements MyBizable {
public long getProtocolVersion(String protocol , long clientVersion) throws IOException {
return MyBizable.VERSION;
}
public String hello(String name) {
System.out.println("我被调用了!");
return "hello" +name;
}
}
package mavshuang.rpc;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
public class MyClient {
public static void main(String[] args) throws Exception {
final MyBizable proxy = (MyBizable) RPC.waitForProxy(MyBizable.class, MyBizable.VERSION, new InetSocketAddress(MyServer.SERVER_IP, MyServer.SERVER_PORT), new Configuration());
String result = proxy.hello("world,hello mavs!");
System.out.println("客户端返回的结果:" + result);
RPC.stopProxy(proxy); // 关闭网络连接
}
}说明:RPC.getProxy(),该方法有四个参数,第一个参数是被调用的接口类,第二个是客户端版本号,第三个是服务端地址。返回的代理对象,就是服务端对象的代理,内部就是使用 java.lang.Proxy 实现的。package mavshuang.rpc;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;
public class MyServer {
public static final String SERVER_IP = "localhost";// 指定服务器IP
public static final int SERVER_PORT = 9999;// 指定服务器端口
public static void main(String[] args) throws Exception {
/**
* 构造一个 RPC 服务端.
*
* @param instance
* 实例对象中的方法会被客户端调用
* @param bindAddress
* the address to bind on to listen for connection:监听连接的IP地址
* @param port
* the port to listen for connections on:监听连接的端口号
* @param conf
* the configuration to use:使用的确认协议
*/
final Server server = RPC.getServer(new MyBiz(), SERVER_IP, SERVER_PORT, new Configuration());
server.start();// 启动服务
}
}说明:RPC.getServer 方法,该方法有四个参数,第一个参数是被调用的 java对象,第二个参数是服务器的地址,第三个参数是服务器的端口。获得服务器对象后,启动服务器。这样,服务器就在指定端口监听客户端的请求。
查看 NameNode 的源码,如下图所示
按照分析 NameNode 的思路,看一下 DataNode 的源码接口。
在上图中,返回值正是第 713 行创建的对象。继续查看该方法:
在上图中,可以看到 namenode 其实是 ClientProtocal 接口。那么,这个对象是什么时候创建?如下图所示。
继续在 FileSystem 类分析,读数据使用的是 open(…)方法,可以看到源码,如下图所示。
在上图中,返回的是 DFSClient 类中 DFSDataInputStream 类,显而易见,这是一个内部类。这个内部类的构造函数,有两个形参,第一个参数是 dfs.open(…)创建的对象。看一下方法的源码,如下图所示。
在上图中,这个构造方法中最重要的语句是第 1834 行,打开信息,从第 1840 行开始是 openInfo()的源代码,截图显示不全。注意第 1841 行,是获取数据块的信息的。查看这一行的源代码,如下图所示。
标签:blog http io ar os 使用 sp java for
原文地址:http://blog.csdn.net/mavs41/article/details/41090531