Java (Сокеты) ограничение в 64 килобайта

208
11 сентября 2017, 04:01

Пишу клиент-сервер используя сокеты, передача файлов работает но с файлами не более 64 килобайт, почему так и как с этим бороться?

Сервер

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket servsock = new ServerSocket(4444);
        File myFile = new File("D:\\Games\\Dog.mp3");
        long len = myFile.length();
        System.out.print(len);
        while (true) {
            Socket sock = servsock.accept();
            byte[] mybytearray = new byte[(int) myFile.length()];
            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(myFile));
            bis.read(mybytearray, 0, mybytearray.length);
            OutputStream os = sock.getOutputStream();
            os.write(mybytearray, 0, mybytearray.length);
            os.flush();
            sock.close();
        }
    }
}

Клиент

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;
public class Client {
    public static void main(String[] argv) throws Exception {
        Socket sock = new Socket("127.0.0.1", 4444);
        byte[] mybytearray = new byte[50000000];
        InputStream is = sock.getInputStream();
        FileOutputStream fos = new FileOutputStream("D:\\Dog.mpe");
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        System.out.println(mybytearray);
        System.out.println(mybytearray.length);
        int bytesRead = is.read(mybytearray, 0, mybytearray.length);
        bos.write(mybytearray, 0, bytesRead);
        bos.close();
        sock.close();
    }
}
Answer 1

Как вам уже ответили в комментариях - чтение данных нужно производить в цикле, контролируя всё вручную.

Клиент

ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024]; // Буфер
int length;
// Читаем файл "складывая" прочитанные байты в byteArrayStream
while ((length = bis.read(buffer, 0, buffer.length)) != -1) {
    byteArrayStream.write(buffer, 0, length);
}
// Отправляем их клиенту
os.write(byteArrayStream.toByteArray());
os.flush();

Сервер

ByteArrayOutputStream byteArrayStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
// Теперь таким же образом читаем данные из входящего потока
while ((length = is.read(buffer, 0, buffer.length)) != -1) {
    byteArrayStream.write(buffer, 0, length);
}
// Запись в файл
bos.write(byteArrayStream.toByteArray());
bos.flush();

Альтернативы:

Apache Commons IO

byte[] bytes = IOUtils.toByteArray(inputStream);

Google Guava

byte[] bytes = ByteStreams.toByteArray(inputStream);

READ ALSO
Как генерировать токен при входе и удалять при выходе?

Как генерировать токен при входе и удалять при выходе?

Использую FCM для пуш уведомленийКак генерировать токен при определенном событии? Как правильно привязать токен к аккаунту? Расскажите общий...

356
Почему обращение к SomeClass.class не вызывает инициализацию класса SomeClass?

Почему обращение к SomeClass.class не вызывает инициализацию класса SomeClass?

Вопрос такой: Почему использование Aclass не вызывает инициализацию класса А?

187
Не обновляется время в классе, вызваном циклом Java

Не обновляется время в классе, вызваном циклом Java

ЗдравствуйтеПри вызове (int) (System

345
SAXParser проблема с кодровкой

SAXParser проблема с кодровкой

Пытаюсь распарсить файл, java SAXParser

243