java rmi怎样实现服务器间的通信

2024年11月04日 23:09
有3个网友回答
网友(1):

首先要选用技术,这很明显做个socket就行,简单通讯,还可以扩展为非局域网的主机。

1,编写socket服务器端 放在主服务器上,利用开机启动的方式启动server
并保持监听某端口
2,编写socket客户端放在 你需要的从属服务器上,同样利用开机启动的方式
运行client,然后程序中利用 经过包装client.getOutputStream()的流,向服务器发送消息,就是那个ip (当字符串发,转换为byte[])

(细节我就不介绍了…… )
3,汇总的实质就是 server 利用
client.getInputStream()的包装流(假如叫in)
存放数据的数组,假如叫 bytep[] buf;
获得数据 in.read(buf,0,buf.length);

然后:
File file = new File("D://log.txt");//假如是你要的log文件
FileInputStream fis =new FileInputStream(file);
fis.write(buf);

这样就搞定了
细节注意点:由于log文件需要保留旧数据,所以写文件的时候要注意选用Acess流进行插入。另外,当从属服务器关闭的时候,也要发个信息过来,把对应的ip删除掉哦!

给我分呗

网友(2):

有几个建议
1:主服务器不用主动发IP给子服务器(主服务器不可能知道子服务器的数目),也没有必要主服务来发,完全可以让子服务器来主动向主服务索取IP。
2:结果完全没有必要以文件形式存放(每次开机要重新获得,没有必要做持久化),完全可以存到一个Set中。

根据以上:我做一个简单的实现:
***********************************************
IHost.java

package test.rmi.host;

import java.rmi.RemoteException;
/**
* remote interface
*
*/
public interface IHost extends java.rmi.Remote
{
void register(String ip) throws RemoteException;

String[] getAllSubServerList() throws RemoteException;

}

***********************************************
Host.java

package test.rmi.host.impl;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashSet;
import java.util.Set;

import test.rmi.host.IHost;

/**
*
* the implentation class of Ihost
*
*/
public class Host extends UnicastRemoteObject implements IHost
{
private static final long serialVersionUID = -2197983171132594422L;

private Set subServers = new HashSet();

public Host() throws RemoteException
{
super();
}

public String[] getAllSubServerList() throws RemoteException
{
String[] ips = new String[] {};
synchronized (this)
{
ips = subServers.toArray(ips);
}
return ips;
}

public void register(String ip) throws RemoteException
{
synchronized (this)
{
subServers.add(ip);
}
}
}
***********************************************
ServiceStartup.java

package test.rmi.host;

import java.rmi.Naming;

import test.rmi.host.impl.Host;

/**
* The main class for Host server,mainly for start up the host
*
*/
public class ServiceStartup
{
public static void main(String args[]) throws Exception
{

Host host = new Host();
Naming.rebind("HostServer", host);
}

}
***********************************************
SubServerStartup.java

package test.rmi.sub;

import java.net.InetAddress;
import java.rmi.Naming;

import test.rmi.host.IHost;

/**
* The main class for Sub server,mainly for start up the sub
*
*/
public class SubServerStartup
{
public static void main(String args[]) throws Exception
{
String hostIp = "";
IHost host = (IHost) Naming.lookup("rmi://" + hostIp + "/HostServer");
String myIp = InetAddress.getLocalHost().toString();
host.register(myIp);

//do something...
try{
//wait for other sub server start up
Thread.sleep(3000);
}catch(Exception e){}

String[] allSubServer = host.getAllSubServerList();
//do something...
}
}
***********************************************

本实现只是提供一个简单的思路和基本的技术实现,希望可以帮助到你
以上代码已经可以运行了,你说的具体点,是哪方面?是如何运行rmi程序吗?

网友(3):

不一定非要用RIM
你可以用socket.
socket分server端程序和client端程序
你在主服务器上启动server端程序,监听某一个端口。
从服务器启动后,调用soket的client端,向主服务器的端口发送消息。主服务器收到消息后,启动一个线程来处理从服务器的请求,然后会给从服务器发送一个response。
这样就能实现你的需求了。