You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
4.1 KiB
121 lines
4.1 KiB
2 years ago
|
/*
|
||
|
* Демонстрационное приложение. Сервер приложения.
|
||
|
*/
|
||
|
package udp;
|
||
|
|
||
|
import java.io.BufferedReader;
|
||
|
import java.io.DataOutputStream;
|
||
|
import java.io.File;
|
||
|
import java.io.FileInputStream;
|
||
|
import java.io.FileOutputStream;
|
||
|
import java.io.IOException;
|
||
|
import java.io.InputStreamReader;
|
||
|
import java.net.DatagramPacket;
|
||
|
import java.net.DatagramSocket;
|
||
|
import java.net.InetAddress;
|
||
|
import java.net.SocketException;
|
||
|
import java.nio.ByteBuffer;
|
||
|
|
||
|
/**
|
||
|
* Класс сервера. Обеспечивает отправку клиенту запрошенного файла.
|
||
|
*
|
||
|
* @author (C)Y.D.Zakovryashin, 16.01.2023
|
||
|
*/
|
||
|
public class UDPServer {
|
||
|
|
||
|
public static final int UDP_SERVER_PORT = 12345;
|
||
|
public static final String UDP_SERVER_ADDRESS = "localhost";
|
||
|
public static final String OK = "Ok";
|
||
|
public static final String NO = "No";
|
||
|
public static final int ERROR = -1;
|
||
|
public static final int BUFFER_SIZE = 255;
|
||
|
private DatagramSocket socket;
|
||
|
private DatagramPacket packet;
|
||
|
private byte[] buffer;
|
||
|
private String fileName;
|
||
|
private long fileLength;
|
||
|
private boolean exists;
|
||
|
|
||
|
public static void main(String[] args) {
|
||
|
System.out.println("Server started...");
|
||
|
try (DatagramSocket s = new DatagramSocket(UDP_SERVER_PORT)) {
|
||
|
UDPServer server = new UDPServer();
|
||
|
server.socket = s;
|
||
|
/**
|
||
|
* Ожидание запроса клиента с именем файла.
|
||
|
*/
|
||
|
server.getFileName();
|
||
|
/**
|
||
|
* Отправка клиенту результата поиска файла: либо размера найденного
|
||
|
* файла, либо кода ERROR, который означает отсутствие запрошенного
|
||
|
* файла на сервере.
|
||
|
*/
|
||
|
server.sendResult();
|
||
|
/**
|
||
|
* Отправка файла с сервера.
|
||
|
*/
|
||
|
if (server.exists && server.getClientReply()) {
|
||
|
server.sendFile();
|
||
|
System.out.println("Server: File \"" + server.fileName
|
||
|
+ "\" is sent successfully.");
|
||
|
}
|
||
|
} catch (SocketException ex) {
|
||
|
System.out.println("Server error #1: " + ex.getMessage());
|
||
|
} catch (IOException e) {
|
||
|
/**
|
||
|
* Произошла ошибка ввода/вывода файла.
|
||
|
*/
|
||
|
System.err.println("Server error #2: " + e.getMessage());
|
||
|
}
|
||
|
System.out.println("Server stoped.");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Чтение имени запрашиваемого файла с консоли.
|
||
|
*
|
||
|
* @return строку с именем файла.
|
||
|
*/
|
||
|
private void getFileName() throws IOException {
|
||
|
buffer = new byte[BUFFER_SIZE];
|
||
|
packet = new DatagramPacket(buffer, BUFFER_SIZE);
|
||
|
socket.receive(packet);
|
||
|
fileName = new String(packet.getData(), 0, packet.getLength());
|
||
|
System.out.println("Step 1: file name: " + fileName);
|
||
|
}
|
||
|
|
||
|
private void sendResult() throws IOException {
|
||
|
File f = new File(fileName);
|
||
|
buffer = new byte[8];
|
||
|
if (exists = f.exists()) {
|
||
|
fileLength = f.length();
|
||
|
ByteBuffer.wrap(buffer).putLong(fileLength);
|
||
|
} else {
|
||
|
ByteBuffer.wrap(buffer).putLong(ERROR);
|
||
|
}
|
||
|
packet.setData(buffer);
|
||
|
packet.setLength(8);
|
||
|
socket.send(packet);
|
||
|
System.out.println("Step 2");
|
||
|
}
|
||
|
|
||
|
private boolean getClientReply() throws IOException {
|
||
|
buffer = new byte[4];
|
||
|
packet.setData(buffer);
|
||
|
socket.receive(packet);
|
||
|
String r = new String(packet.getData()).trim();
|
||
|
System.out.println("Step 3");
|
||
|
return r.equals("Ok");
|
||
|
}
|
||
|
|
||
|
private void sendFile() throws IOException {
|
||
|
buffer = new byte[(int) fileLength];
|
||
|
try (FileInputStream fis = new FileInputStream(fileName)) {
|
||
|
int s = fis.read(buffer);
|
||
|
}
|
||
|
packet.setData(buffer);
|
||
|
socket.send(packet);
|
||
|
System.out.println("Step 4");
|
||
|
}
|
||
|
|
||
|
}
|