Сброс соединения Java при отправке .jpg или изображений через сокет - PullRequest
0 голосов
/ 25 мая 2019

У меня нет проблем с отправкой больших текстовых документов или других файлов через сокеты с помощью java-программы, но когда я пытаюсь отправить файл .jpg или другое изображение, я получаю java.net.SocketException: сброс соединения.

У меня не возникло никаких проблем при отправке текстового документа размером 229 КБ через сокет, но при попытке отправить изображение размером 89 КБ я получаю сообщение об ошибке.Я использую цикл while для чтения и записи файла.

Это часть рассматриваемого класса сервера (он называется EasyDataSend):

public EasyDataSend() throws IOException    
{
   port = 8080;
   server = new ServerSocket(port);

   socket = server.accept(); 

   dataOutputStream = new DataOutputStream(socket.getOutputStream());   
}

public void sendFile(String path) throws IOException
{       
   File file = new File(path);

   InputStream fileInputStream = new FileInputStream(file);
   OutputStream fileOutputStream = socket.getOutputStream();

   byte[] bytes = new byte[16 * 1024];

   int count;
   while ((count = fileInputStream.read(bytes)) > 0) 
   {
      fileOutputStream.write(bytes, 0, count);
   }        

   fileOutputStream.close();
   fileInputStream.close();   
   socket.close(); 
   server.close();
}

И это часть класса клиента (имя EasyDataReceive):

public EasyDataReceive() throws UnknownHostException, IOException
{
   ip = "127.0.0.1";
   port = 8080; 
   socket = new Socket(ip,port);
}

public void receiveFile(String path) throws IOException, SocketException 
{
   File file = new File(path); 
   InputStream fileInputStream = socket.getInputStream();
   OutputStream fileOutputStream = new FileOutputStream(file);

   byte[] bytes = new byte[16*1024];

   int count;
   while ((count = fileInputStream.read(bytes)) > 0) 
   {
      fileOutputStream.write(bytes, 0, count);
   }

   fileOutputStream.close(); 
   fileInputStream.close();
   socket.close();        

}

Это ошибка, которую я получаю:

Исключение в потоке "main" java.net.SocketException: сброс соединения на java.net.SocketInputStream.read (Неизвестный источник) на java.net.SocketInputStream.read (неизвестный источник) в java.net.SocketInputStream.read (неизвестный источник) в EasyDataReceive.receiveFile (EasyDataReceive.java:111) в TesterClient.main (TesterClient.java:23)

Кроме того, строка 111 на самом деле является только началом цикла while в клиентском классе.Я не хотел вставлять весь класс в пост.Строка 23 является лишь частью класса тестирования, где я создаю объект EasyDataReceive.

1 Ответ

0 голосов
/ 25 мая 2019

Ваш сокет должен быть внутри методов: receiveFile () и sendFile ().

Например,

public static void sendFile(String path) throws IOException {
        try {
            socket = new Socket("127.0.0.1", 8080);
            System.out.println("Connected");
            File file = new File(path);
            InputStream fileInputStream = new FileInputStream(file);
            OutputStream fileOutputStream = socket.getOutputStream();
            byte[] bytes = new byte[16 * 1024];
            int count;
            while ((count = fileInputStream.read(bytes)) > 0) {
                fileOutputStream.write(bytes, 0, count);
            }
            fileOutputStream.close();
            fileInputStream.close();
        } catch (UnknownHostException u) {
            System.out.println(u);
        } catch (IOException i) {
            System.out.println(i);
        } finally {
            try {
                 socket.close();
            } catch (IOException i) {
                System.out.println(i);
            }
        }
    }

Или вы должны передать клиенту сокета свой метод, т.е.

private void receiveFile (Socket client) {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...