关键词:
我正在尝试重新编写一些基本的设计模式。我只有代码片段,没有完整的运行代码示例。一种叫做代理模式。
我只想通过远程调用方法。这是我的简单代码:
WebService.Java
public class WebService extends UnicastRemoteObject implements IRemote
private static final long serialVersionUID = 1L;
public static void main(String[] args)
try
IRemote service = new WebService();
Naming.rebind("RemoteCalculator", service);
catch (Exception e)
e.printStackTrace();
/** No arg default constructor */
public WebService() throws RemoteException
/** Methods of remote interface */
@Override
public double getRoot(double v) throws RemoteException
return Math.sqrt(v);
...其中IRemote是一个简单的接口,用于扩展远程接口并定义单个示例方法(getRoot(double))的签名。
现在连接到远程的类:
test proxy.Java
public class TestProxy implements Remote
/**
* @param args
*/
public static void main(String[] args)
new TestProxy().go(args[0]);
public TestProxy()
public void go(String ip)
try
System.out.println("Trying to lookup for service ...");
IRemote service = (IRemote) Naming.lookup("//" + ip + "/RemoteCalculator");
System.out.println("done");
double d = service.getRoot(5.0);
System.out.println(d);
catch (Exception e)
e.printStackTrace();
我正在运行rmiregistry.exe并通过rmic.exe创建我的WebService_Stub.class,如某些文档中所示。本地连接127.0.0.1作为(ip-)参数工作正常。但即使端口(1099)已打开并通过telnet检查,也无法通过互联网进行连接。
当我从命令行开始时:
java net.mypackage.remote.TestProxy 78.2.2.2
它总是给出结果:
试图查找服务...已完成java.rmi.ConnectException:连接拒绝主机:192.168.1.51;嵌套的例外是:java.net.ConnectException:在sun.rmi的sun.rmi.transport.tcp.TCPChannel.createConnection(未知来源)sun.rmi.transport.tcp.TCPEndpoint.newSocket(未知来源)的连接超时.transport.tcp.TCPChannel.newConnection(未知源)位于java.rmi.server.RemoteObjectInvocationHandler的java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unkn own Source)中的sun.rmi.server.UnicastRef.invoke(未知源)。在net.gerdsmeier.remote.TestProxy.main(TestProxy.java:22)net.gerdsmeier.remote.TestProxy.go(TestProxy.java:39)上的$ Proxy1.getRoot(未知来源)调用(未知来源)引起:java.net.ConnectException:在java.net上的java.net.AbstractPlainSocketImpl.connectToAddress(未知来源)java.net.AbstractPlainSocketImpl.doConnect(未知来源)的java.net.PlainSocketImpl.socketConnect(本机方法)连接超时java.net.S java.net.SocksSocketImpl.connect(未知来源)中的.AbstractPlainSocketImpl.connect(未知来源)来自java.net.Socket。(java)的java.net.Socket.connect(未知源)的ocket.connect(未知源),位于sun.rmi.transport.proxy的java.net.Socket。(未知来源)。 sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)的RMIDirectSocketFactory.createSocket(Unknown Source)... 9更多
其中192.168.1.51是我的本地ip-adress(即端口转发工作正常)。
好吧,我猜你的WebService是在NAT之后,你已经在1099上设置了端口转发以进入RMI注册表。这还不够。远程对象将在不同于1099的端口上进行侦听。如果没有设置端口转发到此端口,则永远不会连接,因此在double d = service.getRoot(5.0)
行处有例外。
问题是哪个端口转发?如果您没有指定端口,RMI将随机选择一个高端口。但是您可以使用UnicastRemoteObject构造函数的版本指定端口。因此,您可以选择端口号,执行IRemote service = new WebService([portnumber]);
并在该端口上设置端口转发。
看它是否削减它!
好吧,我已经解决了部分问题。它是服务器存根的逻辑背后:
在服务器端,我们必须通过添加行来添加有关全局主机名的信息
System.setProperty("java.rmi.server.hostname",Util.getGlobalAddress().getHostAddress());
... Util类可能看起来像:
public class Util
/**
* Finds this computer's global IP address
*
* @return The global IP address, or null if a problem occurred
*/
public static Inet4Address getGlobalAddress()
try
URLConnection uc = new URL( "http://vallentinsource.com/globalip.php" ).openConnection();
BufferedReader br = new BufferedReader( new InputStreamReader( uc.getInputStream() ) );
return ( Inet4Address ) InetAddress.getByName( br.readLine() );
catch( MalformedURLException e )
e.printStackTrace();
catch( IOException e )
e.printStackTrace();
return null;
现在它在一个方向上工作,即客户端调用,如
service.printName("Pete");
在服务器端正常工作。另一方面 ...
d = service.getRoot(5.0);
System.out.println(d);
...在客户端上还没有工作。它不会引发错误,但我们没有得到结果。然而。您可以通过添加客户端ip地址/主机名来修复它:
System.setProperty("java.rmi.client.hostname", "ip.of.client.pc");
但是服务器事先无法知道所有客户端地址。无论如何:这是一种解决方法,在某些情况下可能有所帮助。
javarmi-komunikacjamiędzyprocesowa。przykładdeklaracjiinterfejsuzdalnegoijegoimplementacjio(代码片段)
javarmi学习笔记(代码片段)
前言开始学习一下Java中RMI的相关知识。RMI是我目前为止学起来比较难的一块,主要的原因就是一我没学过计网,对于这种通信相对来说有点陌生,很多文章后面的抓包分析我也看不懂。二就是初学Java,很多东西... 查看详情
javarmi学习笔记(代码片段)
前言开始学习一下Java中RMI的相关知识。RMI是我目前为止学起来比较难的一块,主要的原因就是一我没学过计网,对于这种通信相对来说有点陌生,很多文章后面的抓包分析我也看不懂。二就是初学Java,很多东西... 查看详情
nginxupstreamdns解析缓存问题(代码片段)
...m:8080;如上配置所示,server中为第三方提供的接口服务地址,提供了互联网域名地址(但是该域名对应的DNS解析IP地址会定期更新)。当我们把一个域名解析可能会变的域名用作upstream中时 查看详情
nginxupstreamdns解析缓存问题(代码片段)
...m:8080;如上配置所示,server中为第三方提供的接口服务地址,提供了互联网域名地址(但是该域名对应的DNS解析IP地址会定期更新)。当我们把一个域名解析可能会变的域名用作upstream中时 查看详情
javarmi教程:入门与编译方法远程(代码片段)
1.概述转载:RMI教程:入门与编译方法2.分布式对象和RMI分布式对象技术主要是在分布式异构环境下简历应用系统框架和对象构件。在应用系统框架的支撑下,开发者可以将软件功能封装为更易于管理和使用的对象ÿ... 查看详情
百度地图地址解析/逆地址解析(代码片段)
由于工作需要,需要根据经纬度获得地址,或者根据地址获得经纬度,使用百度api 类清单1.ReverseGeocodingRequest.java 逆地址解析的请求类2.Location.java 经纬度类3.ReverseGeocodingResponse.java ... 查看详情
使用自己的域名解析博客园地址(csdn也可以)(代码片段)
...文通过配置githubpage静态页面的功能,跳转到指定的博客地址来解决这个问题。(直接配置域名解析到博客地址无法访问)实现原理:用户访问--->阿里云解析--->githubpag 查看详情
json解析地址对象(代码片段)
text地址解析协议(代码片段)
地址解析协议(arp)和逆地址解析协议(rarp)(代码片段)
...位于同一局域网上的另一台主机时,是根据48bit的以太网地址来确定目的接口的。地址解析协议(ARP),为IP地址到对应的硬件地址之间提供动态映射。(动态,是指系统自动完成)逆地址解析协议(RARP),被哪些没有磁盘驱动... 查看详情
identityserver4实战-必须使用https问题解析(代码片段)
...代码为IdentityServer4的QuickStart2的源代码,文末会给出下载地址1.修改QuickstartIdentityServer项目监听地址该项目默认监听localhost,我们需要改变,让 查看详情
wget:无法解析主机地址(代码片段)
...s.aliyun.com)...失败:未知的名称或服务。wget:无法解析主机地址“mirrors.aliyun.com”DNS有问题,之前手动配置DNS导致,执行如下内容(8.8.8.8是谷歌提供的)echo‘nameserver8.8.8.8‘>>/etc/resolv.conf也可使用阿里巴巴提供的DNS域名解析namese... 查看详情
arp:地址解析协议(代码片段)
ARP背后的基本概念,网络接口有一个硬件地址(一个48bit的值,标识不同的以太网或令牌环网接口)。知道主机的IP地址并不嗯呢该让内核发送一帧数据给主机。必须要知道目的端的硬件地址才能发送数据。 ARP的功能就... 查看详情
lvs负载均衡:vs_tun和vs_dr的arp问题(代码片段)
1.ARP协议简介ARP(AddressResolutionProtocol)协议称为地址解析协议,用于将主机IP地址解析为主机的MAC地址,即IP-->MAC之间一一映射。RARP协议相反,是将MAC地址解析为IP地址,MAC——>IPARP解析时分两种情况:解析目标和自己在同一网... 查看详情
djangourl反向解析(代码片段)
...;视图函数中302跳转HttpResponseRedirect(\'url\')URL书写规范绝对地址http://127.0.0.1:8000/page/1相对地址/page/1\'/\'开头得相对地址,浏览器会把当前地址栏得协议、i 查看详情
深拷贝使用解析(代码片段)
...,或按照某一函数进行过滤或者累计,由于java引用的是地址,这样就带来操作问题。如:Table<Object,Object,Object>table=HashBasedTable.create();Tabletable2=table;.......//对table进行操作,这时,table2也跟着变化原因就在于,java使用的是浅... 查看详情
winsocket编程之域名解析(代码片段)
...,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式 查看详情