java.io.EOFException 正在接收对象。通过套接字从客户端向服务器发送文件

java.io.EOFException while reciving a object. send file from client to server through socket

我正在创建一个可以通过套接字共享文件的 android 应用程序。首先,我正在创建一个服务器,它将 运行 在每个应用程序上,如果一个应用程序想要将文件发送给另一个用户,那么他可以 select 服务器 ip 地址并发送文件。

这里是服务器部分

 public class ServerSocketThread extends Thread {

    @Override
    public void run() {
        Socket socket = null;
        try {
            serverSocket = new ServerSocket(SocketServerPORT);
            MessageActivity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    infoPort.setText("I'm waiting here: "
                            + serverSocket.getLocalPort());
                }});

            while (true) {
                socket = serverSocket.accept();
              //  FileTxThread fileTxThread = new FileTxThread(socket);
              //  fileTxThread.start();
                //---------------------------------
                ClientRxThread clientRxThread = new ClientRxThread(socket);
                clientRxThread.start();
                //----------------------------------------
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
 private class ClientRxThread extends Thread {
    Socket socket = null;


    ClientRxThread(Socket socket) {
        this.socket=socket;
    }

    @Override
    public void run() {

        File file;
        ObjectInputStream ois;
        ois = null;
        InputStream in = null;
        byte[] bytes;
        FileOutputStream fos = null;


        file = new File(getApplicationInfo().dataDir, "test.png");
        try {
                in = socket.getInputStream();
            } catch (IOException ex) {
                System.out.println("Can't get socket input stream. ");
            }
        try {
            ois = new ObjectInputStream(in);
        } catch (IOException e1) {
            System.out.println("Can't get Object Input Stream. ");
            e1.printStackTrace();

        }
        try {
            assert ois != null;
            bytes = (byte[])ois.readObject();
        } catch (ClassNotFoundException | IOException e) {
            System.out.println("Can't read Object . ");
            bytes= new byte[0];
                e.printStackTrace();
            }

        try {
            fos = new FileOutputStream(file);
        } catch (FileNotFoundException e1) {
            System.out.println("Can't get file output stream . ");
            e1.printStackTrace();
        }


        try {
            assert fos != null;
            fos.write(bytes);
        } catch (IOException e1) {
            System.out.println("Can't file output stream write . ");
            e1.printStackTrace();
        }
        finally {
                if(fos!=null){

                    try {

                        fos.close();
                        socket.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
            }
            MessageActivity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    Toast.makeText(MessageActivity.this,
                            "Finished",
                            Toast.LENGTH_LONG).show();
                }});
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

这是客户端部分

  private class ClientRxThread extends Thread {
    String dstAddress;
    int dstPort;

    ClientRxThread(String address, int port) {
        dstAddress = address;
        dstPort = port;
    }

    @Override
    public void run() {
        Socket socket = null;

        try {
            socket = new Socket(dstAddress, dstPort);

            FileTxThread fileTxThread = new FileTxThread(socket);
            fileTxThread.start();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

public class FileTxThread extends Thread {
    Socket socket;

    FileTxThread(Socket socket){
        this.socket= socket;
    }

    @Override
    public void run() {
        File file = new File(newImageUri.getPath());

        byte[] bytes = new byte[(int) file.length()];
        BufferedInputStream bis;
        try {
            bis = new BufferedInputStream(new FileInputStream(file));
            final int read = bis.read(bytes, 0, bytes.length);

            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(bytes);
            oos.flush();

            socket.close();

            final String sentMsg = "File sent to: " + socket.getInetAddress();
            FileSharingActivity.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    Toast.makeText(FileSharingActivity.this,
                            sentMsg,
                            Toast.LENGTH_LONG).show();
                }});

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

我正在获取 java.io.EOFException 这部分的服务器。任何帮助都会很棒。

 try {
            ois = new ObjectInputStream(in);
        } catch (IOException e1) {
            System.out.println("Can't get Object Input Stream. ");
            e1.printStackTrace();

对等方已关闭套接字,这导致接收方的流结束,从而导致 readObject() 中的 EOFException

这里有几个问题。服务器和客户端都不应关闭那些 finally 块中的 socket

  • 服务器中的 finally 块应该关闭 serverSocket,而不是 socket,并且 socket should be a local variable in theaccept()` 循环,而不是在外部范围内。一旦循环迭代就没有意义了。
  • 客户端应该在启动处理它的线程中关闭 socket,而不是在启动线程的代码中。
  • 客户甚至没有创建 ObjectOutputStream,至少在您发布的代码中没有。如果您不打算在发送方使用 ObjectOutputStream,则不能在接收方使用 ObjectInputStream