Ошибка при загрузке с сервера файла.Socket. Android. Java. :Connection reset by peer: socket write error.

490
30 января 2017, 17:10

Реализую передачу между устройствами при помощи socket'ов. Передача проходит между Windows ПК и Android девайсом. При передаче файлов с Android устройства на ПК ошибок не появляется и всё исправно работает, но при передаче с ПК на Android появляется ошибка:

java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at com.company.Main.send(Main.java:84)
at com.company.Main.main(Main.java:51)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

При передаче между устройствами Android получения файла не происходит, но программа не вылетает.

Код Server:

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Main {
//отправляем
public static Scanner scanner;
public static void main(String[] args) throws IOException
{
    String fileLocation;
    int portNo;
    scanner=new Scanner(System.in);
    System.out.println("Enter port number of machine(e.g. '2000') :");
    portNo=scanner.nextInt();
    System.out.println("Please enter file location with file name (e.g. 'D:\\abc.txt'): ");
    fileLocation=scanner.next();
    Main.send(portNo,fileLocation);
}
public static  void send(int portNo,String fileLocation) throws IOException
{
    FileInputStream fileInputStream = null;
    BufferedInputStream bufferedInputStream = null;
    OutputStream outputStream = null;
    ServerSocket serverSocket = null;
    Socket socket = null;
    //создания связи между отправителем и получателем
    try {
        serverSocket = new ServerSocket(portNo);
        System.out.println("Waiting for receiver...");
        try {
            socket = serverSocket.accept();
            System.out.println("Accepted connection : " + socket);
            //соединение успешно установлено
            //создание объекта для отправки файла
            File file = new File (fileLocation);
            byte [] byteArray  = new byte [(int)file.length()];
            fileInputStream = new FileInputStream(file);
            bufferedInputStream = new BufferedInputStream(fileInputStream);
            bufferedInputStream.read(byteArray,0,byteArray.length);
            // скопировать файл в объект bytearray
//отправка файла через сокет
            outputStream = socket.getOutputStream();
            System.out.println("Sending " + fileLocation + "( size: " +     byteArray.length + " bytes)");
            outputStream.write(byteArray,0,byteArray.length);
            //копирование bytearray для гнезда
            outputStream.flush();
            //промывка гнезда
            System.out.println("Done.");
            //файл был отправлен
        }
        finally {
            if (bufferedInputStream != null) bufferedInputStream.close();
             if (outputStream != null) bufferedInputStream.close();
          if (socket!=null) socket.close();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    finally {
        if (serverSocket != null) serverSocket.close();
    }
}
}

Код Client(Android devise) реализовано в потоке, разрешения на чтение и запись файлов есть:

class  Getter extends AsyncTask<Object, Object, Void> {
//прежде чем задача выполнена
@Override
protected void onPreExecute() {
    super.onPreExecute();
    //начало процесса
}
//после окончания задачи
@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);
    //процесс окончен
}
@Override
protected void onProgressUpdate(Object... values) {
}
//задача\
@Override
protected Void doInBackground(Object... params) {
    int bytesRead = 0;
    int current = 0;
    FileOutputStream fileOutputStream = null;
    BufferedOutputStream bufferedOutputStream = null;
    Socket socket = null;
    try {
        //создания связи.
        socket = new Socket(ipAddress2, portNo);
        //System.out.println("connected.");

        // получить файл
        byte[] byteArray = new byte[6022386];
        // файла чтение из сокета
        InputStream inputStream = socket.getInputStream();
        fileOutputStream = new FileOutputStream(fileLocation2 + filename);
        bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
        bytesRead = inputStream.read(byteArray, 0, byteArray.length);//copying file from socket to byteArray

        current = bytesRead;
        do {
            bytesRead = inputStream.read(byteArray, current, (byteArray.length - current));
            if (bytesRead >= 0) current += bytesRead;
        } while (bytesRead > -1);
        bufferedOutputStream.write(byteArray, 0, current);                            //writing byteArray to file
        bufferedOutputStream.flush();                                                //flushing buffers
         } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } finally{
        if (fileOutputStream != null) try {
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (bufferedOutputStream != null) try {
            bufferedOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (socket != null) try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return null;
}
}

Могу предположить, что проблема в Client, здесь:

finally{
        if (fileOutputStream != null) try {
            fileOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (bufferedOutputStream != null) try {
            bufferedOutputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (socket != null) try {
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Но не знаю как исправить, в интернете информации по исправлению нет.

READ ALSO
Когда можно использовать imageView.setImageBitmap(bitmap). Чем еще кроме канвас динамично менять изображение в ImageView

Когда можно использовать imageView.setImageBitmap(bitmap). Чем еще кроме канвас динамично менять изображение в ImageView

вот есть у меня imageview , если в методе onCreate я присваиваю imageViewsetImageBitmap(bitmap), то всё нормально отображается

502
Как в eclipse в java-проект добавить файл .class?

Как в eclipse в java-проект добавить файл .class?

Всем привет! Помогите разобраться! Как в eclipse в java-проект добавить файлclass? Если делаю через 'Add Class Folder

274
Отдача JSON со SPRING MVC

Отдача JSON со SPRING MVC

В spring boot есть такая замечательная штука для отдачи JSON'ов с автоматическим вытягиванием его из класса:

414
FragmentManager FrameLayout

FragmentManager FrameLayout

В общем я хочу сделать некое подобие TabLayout with ViewPager но без использования первого и второгоВ роли TabLayout у меня будут выступать кнопки а в роли...

357