我用RMI创建了一个Server,Client类程序。但是每当我从命令提示符启动rmiregistry后运行我的服务器时,就会抛出已经处于使用状态的端口错误。只有我开始了这种情况。我已经从netstat检查了它。
服务器代码:
public class Server implements Runnable, Linker{
private static Server server = null;
private static Linker l = null;
private String name = null;
public Server(){}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void run(){
while(!("Andy").equalsIgnoreCase(name)){
}
}
public static void createStub(){
try{
server = new Server();
l = (Linker) UnicastRemoteObject.exportObject(server, 1099);
Registry registry = LocateRegistry.getRegistry();
registry.bind("Link", l);
System.out.println("Ready");
}
catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
createStub();
Thread t = new Thread(server);
}
}
客户代码:
public class Client implements Runnable{
private Scanner sc = new Scanner(System.in);
private Linker linker = null;
public void loadStub(){
try{
Registry registry = LocateRegistry.getRegistry(1099);
linker = (Linker) registry.lookup("Link");
}catch(Exception e){
}
}
public void run(){
String ip = null;
while(sc.hasNext()&&!(ip = sc.nextLine()).equalsIgnoreCase(":q")){
try {
linker.setName(ip);
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String...args){
Client client = new Client();
client.loadStub();
Thread t = new Thread(client);
t.start();
}
}
例外:
java.rmi.server.ExportException: Port already in use: 1099; nested exception is:
java.net.BindException: Address already in use: JVM_Bind
答案 0 :(得分:42)
如果您使用的是macOS,则可以按以下方式停止端口:
首先需要找到PID_number:lsof -i :1099
然后杀死该端口:kill -9 PID_number
答案 1 :(得分:7)
rmiregistry
在其进程中使用端口1099,因此您无法在其中使用它。之一:
LocateRegistry.createRegistry()
(首选)rmiregistry
。答案 2 :(得分:7)
使用此服务器代码 -
Registry registry = null;
try {
registry = LocateRegistry.getRegistry(52365);//use any no. less than 55000
registry.list();
// This call will throw an exception if the registry does not already exist
}
catch (RemoteException e) {
registry = LocateRegistry.createRegistry(52365);
}
答案 3 :(得分:1)
重新检查端口1099是否未被任何其他进程或用户使用,或者是否在其他某个端口上启动rmiregistry。
答案 4 :(得分:1)
使用ps -aef | grep rmiregistry。 找到rmiregistry使用的pid。 杀了pid Den再次运行服务器...... !!!!
答案 5 :(得分:1)
试试这个:
lsof -P | grep ':1099' | awk '{print $2}' | xargs kill -9