前段時間寫了一個全文檢索服務,用的是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>