获得;java.io.EOFException“;通过套接字发送文件后

获得;java.io.EOFException“;通过套接字发送文件后,java,sockets,objectoutputstream,objectinputstream,eofexception,Java,Sockets,Objectoutputstream,Objectinputstream,Eofexception,我正在尝试通过套接字实现基本通信,我现在拥有的是: 要在套接字上侦听的服务器启动 this.serverSocket_ = new ServerSocket(this.serverPort_); clientSocket = this.serverSocket_.accept(); 客户端连接,服务器启动单独的线程与该客户端一起运行 打开对象输出和输入流 out = new ObjectOutputStream(clientSocket_.getOutputStream()); out.f

我正在尝试通过套接字实现基本通信,我现在拥有的是:

  • 要在套接字上侦听的服务器启动

    this.serverSocket_ = new ServerSocket(this.serverPort_);
    clientSocket = this.serverSocket_.accept();
    
  • 客户端连接,服务器启动单独的线程与该客户端一起运行

  • 打开对象输出和输入流

    out = new ObjectOutputStream(clientSocket_.getOutputStream());
    out.flush();
    in = new ObjectInputStream(clientSocket_.getInputStream());
    
  • 客户端在该流上发送两个i-double,String和Long(在每个i-double之后刷新)

  • 服务器通过先前打开的流成功接收这些对象

    conf_ = (Double) in_.readObject();
    supp_ = (Double) in_.readObject();
    separator_ = (String) in_.readObject();
    fileSize_ = (Long) in_.readObject();
    
  • 现在是“最难的部分”

  • 客户端希望发送文件,因此会打开不同的输出流(而不是对象输出流)并发送文件

    FileInputStream fis = new FileInputStream(dataFile_);
    BufferedInputStream bis = new BufferedInputStream(fis);
    OutputStream os = clientSocket_.getOutputStream();
    
    while (current < fileSize) {
        bytesRead = bis.read(mybytearray, 0, mybytearray.length);
        if (bytesRead >= 0) {
            os.write(mybytearray, 0, mybytearray.length);
            current += bytesRead;
        }
        progressBar_.setValue(current);
        progressBar_.repaint();
    }
    os.flush();
    
  • 客户端应该接收完成整个通信的结果

    String message = (String) in.readObject();
    Console.info("server > " + message);
    
不幸的是,客户端的最后一步失败了,出现了异常:

    java.io.EOFException
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        at basketAnalysis.client.Client.run(Client.java:74)
        at java.lang.Thread.run(Unknown Source)
我希望客户端在发送文件后阻止等待服务器响应,但在发送文件后,它突然结束,出现异常。我很确定我在简单流和对象流之间切换时出错了

有人知道我应该做些什么来让它工作吗


提前谢谢你

我认为你的基本误解是:

客户端希望发送一个文件,以便打开不同的输出流

OutputStream os = clientSocket_.getOutputStream();

这不会打开不同的输出流-这将获得对相同输出流的另一个引用,该输出流已包装在
ObjectOutputStream
中。如果您需要两个数据流,则需要打开两个单独的连接。

当您
out.writeObject(resp)时,服务器端是否出现异常否。实际上,服务器并没有完成它的处理,因为客户端断开了导致服务器端异常的连接。
String message = (String) in.readObject();
Console.info("server > " + message);
    java.io.EOFException
        at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
        at java.io.ObjectInputStream.readObject0(Unknown Source)
        at java.io.ObjectInputStream.readObject(Unknown Source)
        at basketAnalysis.client.Client.run(Client.java:74)
        at java.lang.Thread.run(Unknown Source)
OutputStream os = clientSocket_.getOutputStream();