Отправка изображения по сокету. Java

440
05 февраля 2017, 11:53

Код отправки:

public class client {
private Socket socket;
private ObjectOutputStream out;
public static void main(String[] args) {
    client client = new client();
    client.startClient();
}
@SuppressWarnings("unchecked")
public void startClient(){

    try {
        socket = new Socket("localhost", 7800);
        String str = "Send photo";
        out = new ObjectOutputStream(socket.getOutputStream());
        out.writeObject(str);
        out.flush();
        out.reset();
        DataOutputStream outF = new DataOutputStream(socket.getOutputStream());
        File file = new File("photo_1486047476160.jpg");
        FileInputStream inF = new FileInputStream(file);
        byte[] bytes = new byte[5*1024];
        int count;
        long lenght = file.length();
        outF.writeLong(lenght);
        while ((count = inF.read(bytes)) > -1) {
            outF.write(bytes, 0, count);
        }
        inF.close();
        outF.close();
        out.close();
        socket.close();
    } catch (UnknownHostException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
}}

Код приема:

public class ServerTest {
public static void main(String[] args) {
    ServerTest server = new ServerTest();
    server.run();
}
public void run() {
    try {
        ServerSocket serversocket = new ServerSocket(7800);
        Socket socket = null;
        String object;
        while (serversocket != null) {
            socket = serversocket.accept();
            ObjectInputStream obIn = new ObjectInputStream(socket.getInputStream());
            while ((object = (String) obIn.readObject()) != null){
                if (object.equals("Send photo")){
                    FileOutputStream  out = new FileOutputStream("test2.jpg");
                    DataInputStream in = new DataInputStream(socket.getInputStream());
                    byte[] bytes = new byte[5*1024];
                    int count, total=0;
                    long lenght = in.readLong();
                    while ((count = in.read(bytes)) > -1) {
                        total+=count;
                        out.write(bytes, 0, count);
                        if (total==lenght) break;
                    }
                    out.close();
                }
            }
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}}

Сервер по задумке должен весь жизненный цикл от клиента ждать разные объекты. Но иногда на сервер нужно будет отправлять и картинки.

При отправки картинки уходит 15096 байт, приходит 15097 байт, когда открываю картинку пишет: We can't open this file. Походу в стриме остается какой-то мусор, после отправки объекта и он записывается картинке.

Открыл изображение через блокнот и посмотрел в чем разница между оригиналом. Оказалось на один первый символ больше чем в оригинале, я его удалил и картинка открылась. Теперь собственно вопрос откуда оно берет этот первый символ?

Еще одно наблюдение..при отправке count ровняется 5120, 5120, 4986. А при получение уже 5120, 5120 и 4987.

Answer 1

Нужно было удалить строку out.reset(); - теперь работает.

READ ALSO
Как вставить пробел в строке между цифрами и буквами?

Как вставить пробел в строке между цифрами и буквами?

Есть строка типа "дом15/2"Каким образом можно найти границу между буквами и цифрами и поставить туда пробел

528
Отличие API level < 11 от API level > 11

Отличие API level < 11 от API level > 11

Какие есть важные отличия API level < 11 и API level > 11

535
Инициализация беззнакового массива

Инициализация беззнакового массива

Нужно задать константный массив-сигнатуруСейчас делаю так

422
помогите с board в VkApi

помогите с board в VkApi

делаю вывод в ListView обсуждения с группы

478