我需要调用 RMI 方法从客户端将文件传输到服务器(运行 RMI 方法)
这是代码
RegisterMain : 具有 RMI 方法的 java 文件
Transfer :需要将文件发送到服务器的客户端类。
Test :调用这两个操作的类。
public class RegisterMain extends UnicastRemoteObject implements RegMethod{
protected RegisterMain() throws RemoteException {
super();
System.out.println("We're Connected");
}
@Override
public void FTransfer(String fname) throws RemoteException{
try
{
String path="temp"+fname;
File f2=new File(path);
try {
Socket cli=new Socket("127.0.0.1",60000);
ObjectOutputStream outs = new ObjectOutputStream(cli.getOutputStream());
ObjectInputStream ins = new ObjectInputStream(cli.getInputStream());
FileWriter fw=new FileWriter(f2);
BufferedWriter bw=new BufferedWriter(fw);
int iter=(Integer) ins.readObject();
System.out.println("Iterations :"+iter);
String str;
for(int i=0;i<iter;i++)
{
str=(String)ins.readObject();
System.out.println(i);
fw.write(str);
}
str=(String)ins.readObject();
fw.write(str);
outs.writeObject(new String("OverandOut"));
fw.close();
bw.close();
cli.close();
} catch (Exception e) {
e.printStackTrace();
}
}
catch(Exception e)
{
}
}
}
转移 :
public class Transfer extends Thread {
String fname;
public Transfer(String name) {
fname=name;
}
@Override
public void run() {
super.run();
try {
ServerSocket ser = new ServerSocket(60000);
Socket cli=ser.accept();
ObjectOutputStream outs = new ObjectOutputStream(cli.getOutputStream());
ObjectInputStream ins = new ObjectInputStream(cli.getInputStream());
File f1=new File(fname);
FileReader fr=new FileReader(f1);
BufferedReader br=new BufferedReader(fr);
int flen=(int)f1.length();
int iter=(int)flen/1024;
int latent=flen%1024;
System.out.println("Iterations :"+iter);
outs.writeObject(new Integer(iter));
char[] buff=new char[1024];
for(int i=0;i<iter;i++)
{
fr.read(buff, 0, 1024);
outs.writeObject(new String(buff, 0, 1024));
}
fr.read(buff, 0, latent);
outs.writeObject(new String(buff, 0, latent));
if(((String)ins.readObject()).equals("OverandOut"))
{
System.out.println("Terminating Connection.");
}
fr.close();
br.close();
ser.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public synchronized void start() {
super.start();
run();
}
}
测试 :
public class Test {
public static void main(String[] args) throws UnknownHostException {
try
{
RegMethod intr=(RegMethod)Naming.lookup("//127.0.0.1/Register");
Thread t1,t2,t3;
t1=new Transfer("Final.class");
t1.start();
intr.FTransfer("Final.class");
t1=new Transfer("StatStore.class");
t1.start();
intr.FTransfer("StatStore.class");
t1=new Transfer("Test.class");
t1.start();
intr.FTransfer("Test.class");
}catch(Exception e)
{
e.printStackTrace();
}
}
}
我正在使用 RMI 在同一个(localhost)系统上调用一个方法(我在 Ubuntu 上使用它)。在远程方法的程序逻辑中,我正在创建一个 Socket,而在另一个线程中,我正在创建一个 ServerSocket。在调用远程过程之前,我正在运行线程。
现在我尝试使用各种端口运行我的程序,但它总是抛出一个异常
java.net.SocketException: Address already in use
at java.net.PlainSocketImpl.socketListen(Native Method)
at java.net.AbstractPlainSocketImpl.listen(AbstractPlainSocketImpl.java:365)
at java.net.ServerSocket.bind(ServerSocket.java:337)
at java.net.ServerSocket.<init>(ServerSocket.java:202)
at java.net.ServerSocket.<init>(ServerSocket.java:114)
at Transfer.run(Transfer.java:39)
at Transfer.start(Transfer.java:87)
at Test.main(Test.java:24)
我在同一台机器上运行所有模块(即本地主机)
在一个独立的类中,相同的逻辑可以正常工作,没有任何错误。我的问题是我的程序抛出这样的异常是因为 RMI 和 Sockets 吗?如果是这样,我该如何解决这个问题。