RMI在外網不能通信的解決

前段時間寫了一個全文檢索服務,用的是RMI遠程調用。在本機上寫好後,測試ok.但一部署到服務器上就報找不到服務。在網上找了一大通:
原因如下:
    RMI除了註冊端口外,其通信端口是服務器隨機產生的,因此不容易穿過防火牆。



現將我在網上搜索到的解決方法公佈在這裏,給其它人需要的人一個方便。也給自己一個方便。


一、普通解決:

import java.rmi.server.*;
import java.io.*;
import java.net.*;
public class SMRMISocket extends RMISocketFactory {
    public Socket createSocket(String host, int port) 
        throws IOException{
        return new Socket(host,port);
    }
    public ServerSocket createServerSocket(int port) 
        throws IOException {
        if (port == 0)
            port = 2098;//不指定就隨機
        return new ServerSocket(port);
    }
} 



二、Spring中:

   <bean id="rmiSearchService" class="org.springframework.remoting.rmi.RmiServiceExporter">
	<property name="serviceName" value="search"/><!-- 服務名稱 -->
	<property name="service" ref="searchService"/>
	<property name="serviceInterface" value="velcro.searchengine.ISearcher"/>
	<property name="registryPort" value="2098"/><!-- 端口 -->
	<property name="servicePort" value="2098"/>><!--不指定就隨機 -->
   </bean> 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章