Пытаюсь отправить файлы с сервера на клиент по запросу 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();
}
}