recive对象时的java.io.EOFException。通过socket将文件从客户端发送到服务器

时间:2015-09-11 07:02:04

标签: java android sockets objectinputstream

我创建了一个可以通过套接字共享文件的Android应用程序。首先,我创建一个将在每个应用程序上运行的服务器,如果一个应用程序想要将文件发送给另一个用户,那么他可以选择服务器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();

0 个答案:

没有答案