首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java套接字EOFException

Java套接字EOFException
EN

Stack Overflow用户
提问于 2018-06-03 21:29:50
回答 1查看 331关注 0票数 -2

我使用RMI和套接字在客户机集之间传输文件。问题是,当运行下面的代码时,有时我会在客户端得到这样的异常:

代码语言:javascript
复制
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2671)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:3146)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:858)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:354)
at javafxcyberwind.serverSocket.run(serverSocket.java:38)
at java.lang.Thread.run(Thread.java:748)

这是我的代码示例,异常在注释行中:

客户端:

代码语言:javascript
复制
Server_MethodsPEER S = (Server_MethodsPEER) Naming.lookup("rmi://" + ip + ":" + port + "/" + email);
Server_Methods R = S.peer();
R.uploadToServer(fileName);
Socket s = new Socket(ip, R.getServerSocketPort());
File fres = new File(crep + fileName);
FileInputStream inf = new FileInputStream(fres);
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
byte buf[] = new byte[1024];
int nn;
while ((nn = inf.read(buf)) != -1) {
    out.write(buf, 0, nn);
}
out.close();
inf.close();
s.close();
fres.delete();

服务器:

代码语言:javascript
复制
public class serverSocket implements Runnable {

private final ServerSocket socketserver;
private Socket socket;
private final String ff;
private final String rp;

public serverSocket(ServerSocket s, String file, String rep) {
    socketserver = s;
    ff = file;
    rp = rep;
}

@Override
public void run() {
    try {
        socket = socketserver.accept();
        ObjectInputStream in = new ObjectInputStream(socket.getInputStream());//EOFException here
        FileOutputStream out = new FileOutputStream(new File(rp + ff));
        byte buf[] = new byte[1024];
        int n;
        while ((n = in.read(buf)) != -1) {
            out.write(buf, 0, n);
        }
        in.close();
        out.close();
        socket.close();
        socketserver.close();
    } catch (IOException e) {
        System.err.println("socket err");
    }
}
}

//ServerIMPL
ServerSocket sv;

public void uploadToServer(String fileName) throws RemoteException {
    try {
        sv = new ServerSocket(0);
    } catch (IOException ex) {
        Logger.getLogger(Cloud_ServeurIMPL.class.getName()).log(Level.SEVERE, null, ex);
    }
    Thread t = new Thread(new serverSocket(sv, file, crep));
    t.start();

    Client3_MethodsPEER M = (Client3_MethodsPEER) Naming.lookup("rmi://" + ip + ":" + port + "/" + email);
    Client3_Methods U = M.peer();
    U.uploadToServer(fileName);
    Socket s = new Socket(ip, U.getServerSocketPort());
    File fres = new File(crep + fileName);
    FileInputStream inf = new FileInputStream(fres);
    ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
    byte buf[] = new byte[1024];
    int nn;
    while ((nn = inf.read(buf)) != -1) {
        out.write(buf, 0, nn);
    }
    out.close();
    inf.close();
    s.close();
    fres.delete();
    U.operation();//FileNotFoundException here (use the received files as arguments)
}

一切似乎都很好。为什么会发生这种情况,以及如何解决?

EN

回答 1

Stack Overflow用户

发布于 2018-06-06 08:08:58

FileNotFoundException有两层含义:

  1. On input,找不到文件,由于权限等原因无法打开。
  2. On output,找不到目标目录,由于权限等原因无法写入。

例如,如果您发送的文件名包含服务器上不存在的目录,您将从new FileOutputStream获取FileNotFoundException

你的问题中没有足够的(即任何)信息来说明这一点。

但是:

  • 为此您不需要对象流,甚至不需要数据输入/输出流。您只使用了基本的read()write()方法,所以您也可以只使用套接字streams,directly.
  • You应该使用大于1024字节的缓冲区,比如8192或其倍数。
  • 您可以通过我对just的回答中给出的技术,为每个连接发送多个文件
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50666927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档