Java 亚马逊服务器ec2 Wes上的RMI绑定ip
我已经用服务器和客户端创建了一个RMI项目。我在ec2实例上运行服务器。我在了解如何在ec2上运行server属性以接受我的windows客户端时遇到了一些问题。我遵循以下步骤:Java 亚马逊服务器ec2 Wes上的RMI绑定ip,java,web-services,amazon-ec2,amazon,rmi,Java,Web Services,Amazon Ec2,Amazon,Rmi,我已经用服务器和客户端创建了一个RMI项目。我在ec2实例上运行服务器。我在了解如何在ec2上运行server属性以接受我的windows客户端时遇到了一些问题。我遵循以下步骤: 使用Filezilla传输文件 以管理员身份编译项目 我打开了我的IP地址的服务器端口 我遇到的问题是,我无法使用亚马逊提供的公共ip连接到我的服务器。所以我运行了ifconfig并使用了私有ip。 因此,在代码中,正如您将看到的,我使用了公共AmazonIP,但当我运行它时。我使用以下命令运行它 java SkyC
java SkyCorpServer "172.31.31.94" 666 (private ip)(port)
我不知道怎么做,但是通过这种方式,具有公共IP的客户端能够连接
我已经阅读了关于RMI的绑定和注册表以及它的工作原理(创建注册表并将其转发到端口。连接到端口,然后找到注册表并使用服务器存根)
现在的问题是,客户端在30秒后连接,当我尝试使用远程对象(look_op)时,客户端崩溃,并显示以下消息:
java.rmi.ConnectException: Connection refused to host: 172.31.31.94; nested exception is:
java.net.ConnectException: Connection timed out: connect
我使用了默认权限(全部接受),因为当我尝试这样做时,安全管理器不允许我创建注册表,所以我想这不是问题(权限)
服务器代码:
private static int port =666;
private static String hostname = "35.167.2xx.xx";
public static void main(String[] args) throws RemoteException {
String bindLocation = "//" + hostname + ":" + port + "/Hello";
System.setProperty("java.rmi.server.hostname",hostname);
if (System.getSecurityManager() == null) {
System.setSecurityManager(new SecurityManager());
}
try { // special exception handler for registry creation
LocateRegistry.createRegistry(port);
System.out.println("java RMI registry created.");
} catch (RemoteException e) {
// do nothing, error means registry already exists
System.out.println("java RMI registry already exists.");
}
SkyCorpServer server = new SkyCorpServer();
try {
Naming.bind(bindLocation, server);
System.out.println("Addition Server is ready at:" + bindLocation);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
System.out.println("Addition Serverfailed: " + e);
}
服务器输出(无错误运行)(我使用的命令向上滚动):
如您所见,服务器在172.31.31.94侦听端口:666
客户端代码:
private final static String remoteHostName = "35.167.2xx.xx";
private final static int remotePort = 666;
public SkyCorpClient() throws NotBoundException, MalformedURLException, RemoteException {
String connectLocation = "//" + remoteHostName + ":" + remotePort + "/Hello";
look_op = (ChatInterface) Naming.lookup(connectLocation);
System.out.println("Connecting to client at : " + connectLocation);
}
客户端输出(连接时)
尝试使用远程对象查找时:
java.rmi.ConnectException: Connection refused to host: 172.31.31.94; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)
at com.sun.proxy.$Proxy0.registerUser(Unknown Source)
at SkyCorpClient.actionPerformed(SkyCorpClient.java:206)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
我猜它连接到公共ip 35.xxx,因为服务器已经创建了注册到
172.*
的注册表,所以我无法使用该对象。有什么我遗漏的吗?首先-您的端口真的从外部打开了吗?如果只有端口22打开,请检查network interface security(网络接口安全)组,并使用nmap(或其他类似工具)查看端口是否确实可以从外部使用。另外,你是正确的,你应该绑定到所有的ip地址(0.0.0.0),我已经接受所有(入站)流量到myanyware的所有端口。客户机还可以管理连接。我可以ping服务器。我试图使用nmap,但他们绑定了服务器,因为他们有脚本禁止您进行渗透测试,但rmi在端口666上运行。netstat-l如果查找成功,端口转发将正常工作java.rmi.server.hostname应已修复该问题。是否确定已设置,并在导出任何远程对象之前设置?您可以在客户端打印存根并查看它包含的IP地址吗?注意,您应该将createRegistry()
的结果存储到一个静态变量中,并且您应该将远程对象导出到与注册表相同的端口上,或者导出在防火墙中打开的另一个固定端口号(如果您喜欢浪费端口)@EJP我相信连接是延迟初始化的。在远程接口上调用方法之前,查找可能会成功,但不会建立真正的连接。因此,“客户端管理连接”可能不是真的
Connecting to client at : //35.167.203.111:666/Hello
Connected at : 35.167.203.111
java.rmi.ConnectException: Connection refused to host: 172.31.31.94; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:130)
at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:227)
at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:179)
at com.sun.proxy.$Proxy0.registerUser(Unknown Source)
at SkyCorpClient.actionPerformed(SkyCorpClient.java:206)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)