Реализую передачу между устройствами при помощи 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();
}
}
Но не знаю как исправить, в интернете информации по исправлению нет.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
вот есть у меня imageview , если в методе onCreate я присваиваю imageViewsetImageBitmap(bitmap), то всё нормально отображается
Всем привет! Помогите разобраться! Как в eclipse в java-проект добавить файлclass? Если делаю через 'Add Class Folder
В spring boot есть такая замечательная штука для отдачи JSON'ов с автоматическим вытягиванием его из класса:
В общем я хочу сделать некое подобие TabLayout with ViewPager но без использования первого и второгоВ роли TabLayout у меня будут выступать кнопки а в роли...