iteye_19648
2010-11-24 17:21
浏览 235
已采纳

RMI初级问题,请进

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

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

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

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

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • dyccsxg 2010-11-25 20:41
    已采纳

    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]

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • dyccsxg 2010-11-24 20:02

    你试一下
    [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]

    评论
    解决 无用
    打赏 举报
  • dyccsxg 2010-11-24 21:22

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

    评论
    解决 无用
    打赏 举报
  • badonly 2010-11-25 09:13

    [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]

    这个构造函数你研究下!

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题