DataInputStream read(byte [] buffer)返回无关数据

时间:2014-06-06 09:36:26

标签: android sockets inputstream outputstream

如何从服务器端代码接收原始内容和文件名。 客户代码

public void send1(Socket socket)
{
    try
    {
        dataOutputStream = new DataOutputStream(socket.getOutputStream());
        File file = new File(Environment.getExternalStorageDirectory().toString() + "/" + "temp.txt");
        FileInputStream fis = new FileInputStream(file);

        //write file length
        dataOutputStream.writeLong(file.length());
        Log.i("File Size", "" + file.length());

        //write file names
        dataOutputStream.writeUTF(file.getName());
        Log.i("File Name", "" + file.getName());

        //write file to dos
        byte[] buf = new byte[4092];
        int n = 0;
        while((n = fis.read(buf)) != -1)
        {
            Log.i("length bytes", "" + n);
            dataOutputStream.write(buf, 0, n);
        }

        dataOutputStream.flush();
        dataOutputStream.close();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

文件名为temp.txt,内容为Hello

服务器代码

public void receive1(Socket socket)
{
    try
    {
        inputStream = socket.getInputStream();
        dataInputStream = new DataInputStream(inputStream);

        File file = new File(Environment.getExternalStorageDirectory().toString() + "/" + "test.txt");
        FileOutputStream fos = new FileOutputStream(file);

        int n = 0;
        byte[] buf = new byte[4092];

        //read file name
        /*String fileName = "";
        try
        {
            fileName = dataInputStream.readUTF();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        Log.i("File Name", "" + fileName);*/

        //read file size
        long fileSize = 0;
        try
        {
            fileSize = dataInputStream.readLong();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        Log.i("File Size", "" + fileSize);

        //read file
        while((n = dataInputStream.read(buf)) != -1)
        {
            Log.i("length bytes", "" + n);
            fos.write(buf, 0, n);
        }

        fos.flush();
        fos.close();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

文件名为test.txt,内容为temp.txtHello。 在此test.txt文件中,包含temp.txt。我没有从dataInputStream.readUTF()获取文件名。

我错误的代码...

如果我调用readUTF()方法,那么我将获得异常

例外

java.io.EOFException
at libcore.io.Streams.readFully(Streams.java:83)
at java.io.DataInputStream.readFully(DataInputStream.java:99)
at java.io.DataInputStream.decodeUTF(DataInputStream.java:178)
at java.io.DataInputStream.decodeUTF(DataInputStream.java:173)
at java.io.DataInputStream.readUTF(DataInputStream.java:169)

1 个答案:

答案 0 :(得分:0)

您在send方法的inputStream中的Long之前编写了String。你在服务器代码中所做的是你希望在Long之前收到String,这是你在send方法中所做的保留。

<强>溶液

首先读取长读取字符串

<强>样品:

     //read file size
        long fileSize = 0;
        try
        {
            fileSize = dataInputStream.readLong();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        Log.i("File Size", "" + fileSize);

//read file name
        String fileName = "";
        try
        {
            fileName = dataInputStream.readUTF();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        Log.i("File Name", "" + fileName);