Как читать из сокета, используя datainputstream

Я могу отобразить одно полученное изображение, но теперь я хочу получать и записывать несколько изображений на моем диске, которые будут отправляться с Android-клиента каждые 5 секунд.

Socket sock = servsock.accept(); dataInputStream = new DataInputStream(sock.getInputStream()); dataOutputStream = new DataOutputStream(sock.getOutputStream()); System.out.println("Accepted connection : " + sock); dataInputStream = new DataInputStream(sock.getInputStream()); byte[] base64=dataInputStream.readUTF().getBytes(); byte[] arr=Base64.decodeBase64(base64); FileOutputStream imageOutFile = new FileOutputStream("E:\\image.jpeg"); imageOutFile.write(arr); 

Вам нужно будет создать протокол между вашим клиентом и сервером.

Если размер изображения постоянный, вам просто нужно перебрать поток ввода и сохранить буферизацию, пока не получите фиксированное количество байтов и не напишите все уже буферизованное изображение.

В противном случае вам нужно будет добавить некоторые метаданные, указывающие размер изображений; Например, вы можете использовать простой формат:

 [size1][image1][size2][image2][size3][image3] 

С [size-i], занимающим фиксированное количество пространства, и [image-i] размером i-го изображения.

Но, прежде всего, у вас не соблазн сделать такой наивный протокол, как обработка изображения, спящий 5 секунд и извлечение следующего, потому что точное время может сильно различаться между каждым изображением из-за клиента, сети или сервера (ваш код и / Или файловая система).

Небольшие изменения:

 Socket sock = servsock.accept(); dataInputStream = new DataInputStream(sock.getInputStream()); dataOutputStream = new DataOutputStream(sock.getOutputStream()); System.out.println("Accepted connection : " + sock); int imagesCount = dataInputStream.readInt(); for (int imgNum = 0; imgNum < imagesCount; imgNum++) { int imgLen = dataInputStream.readInt(); byte[] base64 = new byte[imgLen]; dataInputStream.readFully(base64); byte[] arr = Base64.decodeBase64(base64); FileOutputStream imageOutFile = new FileOutputStream("E:\\image"+imgNum+".jpeg"); imageOutFile.write(arr); } 

Если у вас несколько клиентов и один сервер. Попробуйте многопоточность. Пример кода:

 public static void main(String[] args){ try { servSocket = new ServerSocket(xxxx); while(true) { socket = servSocket.accept(); ClientNum++; for(int i=0;i<10;i++){ //this for eg accepts 10 clients, with each client assigned an ID. if(threads[i]==null){ sockets[i]=socket; в public static void main(String[] args){ try { servSocket = new ServerSocket(xxxx); while(true) { socket = servSocket.accept(); ClientNum++; for(int i=0;i<10;i++){ //this for eg accepts 10 clients, with each client assigned an ID. if(threads[i]==null){ sockets[i]=socket; 

В вашем «прогоне» вы можете вызвать каждого из этих клиентов по их идентификатору и выполнить требуемую функцию reqd. Не уверен, насколько это ясно. Если необходимо, я могу отправить вам весь код, который у меня есть, похожий на то, что вы делаете.

Intereting Posts
Cordova + Ionic framework – Как безопасно изменить название пакета? Недостаточно памяти для выполнения запрошенной операции – студия Android Как увеличить высоту ProgressBar в ICS / JB Android – прокрутка номера / прокрутка курсора Как вернуть строку из AsyncTask? Что делает флажок «Библиотека», «Под крышкой»? Android: как сделать анимацию перехода на значки меню панели инструментов? Как добавить файл в проект Android, установить его на устройство и открыть его? Получите собственный номер телефона в андроиде (многие проблемы протестированы, но не сработали)? Запрос и разрешение WRITE_EXTERNAL_STORAGE во время выполнения не влияет на текущий сеанс Упаковка собственной библиотеки в APK ScrollView сражается со свитком TimePicker, Timepicker не прокручивается в результате Как получить _count в моем контент-провайдере? Как ограничить длину EditText до 7 целых чисел и 2 десятичных знаков? Android WebView извлечение HTML