Rebel-Cat
@Rebel-Cat

Что может быть не так в коде на прием/передачу файла(Socket)?

Пытаюсь отправить файлы с сервера на клиент по запросу 1 или 2
telnet без проблем принимает текст файлов сколько угодно раз.
Клиент в свою очередь совершает запрос, но не может дождаться файла

Код сервера

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {

    public static void main(String[] args) throws Exception {

        try (ServerSocket serverSocket = new ServerSocket(9001)) {
            while (true) {
                System.out.println("Ожидание клиента");
                Socket socket = serverSocket.accept();
                System.out.println("Клиент подключен");
                new Thread(new MyServer(socket)).start();
            }
        }
    }
}

class MyServer implements Runnable {
    private Socket socket;

    public MyServer(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try (Scanner scanner = new Scanner(socket.getInputStream())) {

            OutputStream os = socket.getOutputStream();

            while (scanner.hasNextLine()) {

                String i = scanner.nextLine();

                if (!socket.isConnected()) {
                    break;

                } else {
                    if (i.equals("1")) {

                        new SendFile(os, "F:\\save.ser");
                        System.out.println("Файл 1 отправлен");

                    } else if (i.equals("2")) {

                        new SendFile(os, "F:\\arxiv.txt");
                        System.out.println("Файл 2 отправлен");
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}


Класс передающий файл

import java.io.*;

public class SendFile {

    public SendFile(OutputStream outputStream,String name) throws Exception {

        File myFile = new File(name);
        byte[] buffer = new byte[(int) myFile.length()];
        FileInputStream fis = new FileInputStream(myFile);
        BufferedInputStream in = new BufferedInputStream(fis);
        in.read(buffer, 0, buffer.length);


        outputStream.write(buffer, 0, buffer.length);
        outputStream.flush();
        in.close();
        fis.close();

        // outputStream.close();   // Если он открыт, то на один клиентский поток, может
                                                // отправиться лишь один файл

    }
}


Клиент

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) {
        try {

            Socket socket = new Socket("127.0.0.1", 9001);

            PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));

            // Создаем объект для чтения строк с клавиатуры
            Scanner scan = new Scanner(System.in, "UTF-8");
            InputStream is = socket.getInputStream();

            while (true) {
                System.out.print("[Запрос]: ");
                String line = scan.nextLine();
                // Отправляем строку серверу
                out.println(line);
                out.flush();

                new ReceiveFile(is,"arxiv.ser");
                System.out.println("Файл получен");

            }
        } catch (Exception x) {
            System.out.println("Ошибка ввода/вывода");
            x.printStackTrace();
        }
    }
}


Класс принимающий файл

import java.io.*;

public class ReceiveFile {

    public ReceiveFile(InputStream is,String name) throws Exception{

        int byteread;
        File test = new File(name);
        FileOutputStream fos = new FileOutputStream(test);
        BufferedOutputStream out = new BufferedOutputStream(fos);
        byte[] buffer = new byte[16384];

        while ((byteread = is.read(buffer, 0, buffer.length)) != -1)
            out.write(buffer, 1, byteread);


        out.flush();
        fos.close();

    }
}
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
@anikavoi
Переведите сокет в асинхронный режим.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы