RMI初级问题,请进

:oops: 小弟这些天在做一个RMI的DEMO。
请问各位大哥。怎样取得客户端的端口号。

取得客户端的ip地址很简单。UnicastRemoteObject类中 getClientHost();可以做到。
请问客户端端口咋弄咧。

抓狂了,再搞不定老大要发飙了.. :cry:

补充: 各位,提供个方向就可以。或者给个链接吧 :wink:

RMI 一般有两个端口,一个是服务端口(默认是 1099),一个是数据端口(默认随机生成),可以将这两个端口都固定下面就不要很麻烦地获取了,要再有其他的就真不知道了。
[code="java"] public static void main(String[] args)throws Exception {
// 启动 rmi 服务,端口为1099
LocateRegistry.createRegistry(1099);
//
RMISocketFactory.setSocketFactory(new CustomerSocketFactory());
// 在 rmi 中注册一个对象
DbAdapter dbadapter = new DbAdapterImpl();
Naming.rebind("dbadapter", dbadapter);
}[/code]
[code="java"]public class CustomerSocketFactory extends RMISocketFactory{
// 提供一个固定的数据端口
public static final int data_port = 10990;

@Override
public ServerSocket createServerSocket(int port) throws IOException {
    if (port == 0){
        port = data_port;
    }
    return new ServerSocket(port);
}

@Override
public Socket createSocket(String host, int port) throws IOException {
    return new Socket(host, port);
}

}[/code]

你试一下
[code="java"]// print client info
String client = this.ref.remoteToString();
String regex = "endpoint:\[(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\:(\d{1,5})\]";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(client);
if (m.find()){
System.out.println("client ip : " + m.group(1));
System.out.println("client port : " + m.group(2));
}
// end print[/code]

不好意思,上面获取到的是服务端的 ip 和 port, 不过 port 应该是同一个.

[code="java"]
/**
* Creates and exports a new UnicastRemoteObject object using the
* particular supplied port and socket factories.
* @param port the port number on which the remote object receives calls
* (if port is zero, an anonymous port is chosen)
* @param csf the client-side socket factory for making calls to the
* remote object
* @param ssf the server-side socket factory for receiving remote calls
* @throws RemoteException if failed to export object
* @since 1.2
*/
protected UnicastRemoteObject(int port,
RMIClientSocketFactory csf,
RMIServerSocketFactory ssf)
throws RemoteException
{
this.port = port;
this.csf = csf;
this.ssf = ssf;
exportObject((Remote) this, port, csf, ssf);
}
[/code]

这个构造函数你研究下!