Я пытаюсь написать клиентскую и серверную часть на java. Серверная часть в порядке (проверено на нескольких клиентах).
Значит, проблема на стороне клиента. Я выделяю память для bytearray
, читаю из BufferedInputStream
и пишу в этот bytearray
. Затем запись из bytearray
в FileOutputStream. Все в порядке, но свободное пространство bytearray
заполняется NULL, поэтому полученный файл неверен (например, изображения).
Я нашел 2 решения этой проблемы:
- Прочитать до
bytearray
до конца файла (но я не знаю, где конец файла) - Читать от
BufferedInputStream
доFileInputStream
, но это не работает:
Мне действительно нужно получить заголовок и файл. Вывести заголовок на консоль и записать файл на диск.
Полный источник
public class SClient {
private static int bufferSize = 8192;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
System.out.println("Enter the address:");
BufferedReader bufferRead = new BufferedReader
(new InputStreamReader(System.in));
try {
String address = bufferRead.readLine();
System.out.println("Enter the extention of receiving file:");
String fileExt = bufferRead.readLine();
// TODO code application logic here
Socket socket = new Socket(address,4040);
BufferedInputStream bis = new BufferedInputStream
(socket.getInputStream());
BufferedOutputStream bout = new BufferedOutputStream
(socket.getOutputStream());
System.out.println("Enter the request:");
String message = bufferRead.readLine();// GET /index.html HTTP/1.0
System.out.println("Header read");
if(message!=null){
bout.write(message.getBytes());
}
FileOutputStream fout = new FileOutputStream("out"+fileExt);
String s1 = "\r\n\r\n";
bout.write(s1.getBytes());
bout.flush();
System.out.println("Header sent");
byte[] res = new byte[bufferSize];
int got;
while((got = bis.read(res))!=-1){
fout.write(res,0,got);
}
fout.close();
bout.flush();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Источник на стороне сервера:
String endLine = "\r\n";
File f = new File(fileName);
FileInputStream fstream;
fstream = new FileInputStream(f);
response = "HTTP/1.0 200 OK" + endLine;
header = "Content-type: "+ contentType + endLine + "Content-length: " + f.length() + endLine + endLine;
bout.write(response.getBytes());
bout.write(header.getBytes());
while(fstream.read(buffer) != -1) {
bout.write(buffer);
}
System.out.println("Message sent");
bout.flush();
socket.close();