服务端与客户端的网络通信
Hadoop的第一个rpc实现——hello world
目前所知道的有三种方式可以实现了吧
第一、就是通过scoket来实现,当然这是底层的;
第二、通过soap协议的webservice或框架的axis2;
第三、就是我们接下来的小例子,通过hadoop的rpc框架。
简要说明一下本例的需求,客户端发送一个字符串,服务端返回服务端的系统名字和这个字符串
先写客户端吧
1、创建共有的接口UserLoginiter
public interface UserLoginiter { public static final long versionID = 1L; public String login(String username); }需要注意以上接口的 versionID字段是必须填写的,否则在后期运行的时候会提示找不到版本号
这个接口是客户端接口,服务端接口应该和这个接口是一样的,接口名也是一样的。
2、不需要实现这个UserLoginIter接口
3、创建客户端启动程序
public class UserLoginController { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); UserLoginiter uli = RPC.getProxy(UserLoginiter.class, 1L, new InetSocketAddress("MyCentOS", 10000), conf); String res = uli.login("likilone"); System.out.println(res); } }
对以上代码中RPC.getProxy里面的参数解释
第一个参数是:接口,共有的接口;
第二个参数是:版本号;
第三个参数是:远程服务端的ip地址和端口号;
第四个参数是:Configuration实例。
接下来我们开始创建服务端,大概也需要三步
1、创建共有的接口UserLoginIter,这个接口和客户端是一致的,这里就不再列出代码
2、实现这个接口
public class ServiceUserLogin implements UserLoginiter{ @Override public String login(String username) { return "hello:"+username + ",您的系统是:"+System.getProperty("os.name"); } }3、创建服务端
public class ServerStarter { public static void main(String[] args) throws HadoopIllegalArgumentException, IOException { Configuration conf = new Configuration(); Builder builder = new RPC.Builder(conf); builder.setInstance(new LoginServiceImpl()).setBindAddress("MyCentOS").setPort(10000).setProtocol(UserLoginiter.class); Server server = builder.build(); server.start(); } }
上面的bulider看起来使用了一个建造者模式
首先建造了一个UserLoginiter接口的实例;
再建造了一个服务端的IP;
再建造了一个服务端的端口;
再建造了一个接口。
自此,建造完成
最后获得一个Service,然后启动,启动后我们发现,服务端一直处于启动状态,这里的底层是不是使用了线程??大家可以猜猜
启动后,我们可以查看服务端是否打开了10000端口
[likilone@MyCentOS ~]$ netstat -nap | grep 10000 (Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) tcp6 0 0 192.168.0.101:10000 :::* LISTEN 7544/java
这个10000端口被java程序使用,说明我们的服务端已经被正常启用
然后启用客户端
就会返回以下信息
hello:likilone,您的系统是:Linux
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情