Я хочу, чтобы мой сервер мог получить имя файла, который будет отправлен на него, а затем после получения этого файла он может сохранить его в новом месте с правильным именем.Отправка имени файла, а затем самого файла
Вот код сервера:
class TheServer {
public void setUp() throws IOException { // this method is called from Main class.
ServerSocket serverSocket = new ServerSocket(1991);
System.out.println("Server setup and listening...");
Socket connection = serverSocket.accept();
System.out.println("Client connect");
System.out.println("Socket is closed = " + serverSocket.isClosed());
BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String str = rd.readLine();
System.out.println("Recieved: " + str);
rd.close();
InputStream is = connection.getInputStream();
int bufferSize = connection.getReceiveBufferSize();
FileOutputStream fos = new FileOutputStream("C:/" + str);
BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] bytes = new byte[bufferSize];
int count;
while ((count = is.read(bytes)) > 0) {
bos.write(bytes, 0, count);
}
bos.flush();
bos.close();
is.close();
connection.close();
serverSocket.close();
}
}
и вот код клиента:
public class TheClient {
public void send(File file) throws UnknownHostException, IOException { // this method is called from Main class.
Socket socket = null;
String host = "127.0.0.1";
socket = new Socket(host, 1991);
// Get the size of the file
long length = file.length();
if (length > Integer.MAX_VALUE) {
System.out.println("File is too large.");
}
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
wr.write(file.getName());
wr.flush();
byte[] bytes = new byte[(int) length];
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
int count;
while ((count = bis.read(bytes)) > 0) {
out.write(bytes, 0, count);
}
out.flush();
out.close();
fis.close();
bis.close();
socket.close();
}
}
Я сделал несколько испытаний моей собственной, и кажется, что мой клиент посылает на имя file right, но почему-то сервер ошибается. Например, если мой клиент говорит, что имя файла «test.txt», мой сервер получает его, например, как «test.txt» -------------------- " или "test.txtPK". Я не понимаю, почему это имя не получило. Кто-нибудь знает, почему это происходит? Или есть более простой способ сделать это? И мой второй вопрос: как я могу использовать это не только в localhost, но и везде? Я попытался изменить свой хост на свой IP-адрес, но он не работал. Благодарю.
Не могли бы вы показать мне, как это сделать? –
Просто вызовите 'wr.newLine()' после 'wr.write (file.getName())'. Возможно, я бы использовал некоторую библиотеку, такую как Apache Commons IO. Он содержит множество полезных утилит поверх классов 'java.io'. –
Это отлично поработало! благодаря –