2013-02-16 7 views
1

Я новичок в Java, поэтому мне нужна помощь. Я пишу приложение, в котором onClick отправит String на сервер, а серверу нужно вернуть изображение с помощью сокета. Таким образом, моя клиентская сторона - Android, а на стороне сервера - ПК - java. Я думаю, что моя серверная сторона в порядке (потому что он печатает все команды system.out.print), но моя клиентская сторона не хороша. Скажите, пожалуйста, где моя ошибка? Благодаря!Отправка изображения через сокет (Java PC - Android)

Вот код моего сервера (PC) на стороне (разъем поставляется через параметр функции):

try { 
     dataInputStream = new DataInputStream(socket.getInputStream()); 
     poruka = "" + dataInputStream.readUTF(); 
     System.out.print(poruka); 

     int bytecount = 2048; 
     byte[] buf = new byte[bytecount]; 

     OutputStream OUT = socket.getOutputStream(); 
     BufferedOutputStream BuffOUT = new BufferedOutputStream(OUT, bytecount); 
     FileInputStream in = new FileInputStream("screenShot.jpg"); 

     int i = 0; 
     while ((i = in.read(buf, 0, bytecount)) != -1) { 
      BuffOUT.write(buf, 0, i); 
      System.out.print("check" + buf[0]); 
      BuffOUT.flush(); 
     } 


     in.close(); 
     BuffOUT.close(); 
     System.out.print("over"); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    }finally{ 
     try { 
      socket.close(); 
      dataInputStream.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

и вот мой клиент (Android) сторона:

  Socket socket = null; 
      DataOutputStream dataOutputStream = null; 

      try { 
       socket = new Socket(IPadresa, 8888); 
       dataOutputStream = new DataOutputStream(socket.getOutputStream()); 
       slanje = "hy string"; 
       dataOutputStream.writeUTF(slanje); 

       FileOutputStream outToFile = new FileOutputStream("slika.jpg"); 

       int bytecount = 2048; 
       byte[] buf = new byte[bytecount]; 


       InputStream IN = socket.getInputStream(); 
       BufferedInputStream BuffIN = new BufferedInputStream(IN, bytecount) 

       int i = 0; 
       int filelength = 0;  
       while((i = BuffIN.read(buf, 0, bytecount)) != -1) { 
        filelength += i; 
        outToFile.write(buf, 0, i); 
        outToFile.flush(); 
       } 


       IN.close(); 
       BuffIN.close(); 




       dataOutputStream.close(); 
       socket.close(); 

      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

больше информации: На стороне сервера я вижу строку, которая отправляется от клиента. И у меня есть System.out.print («over»); команда печатается каждый раз, когда я отправляю String на сервер. Также у меня есть System.out.print («check» + buf [0]); распечатывается с сервера много раз. Поэтому я думаю, что с клиентской стороной что-то не так.

И моя клиентская сторона не выбрасывает никаких Исключения ... но я заметил, что клиентская сторона никогда не пропускала цикл while. Он застрял там.

+0

Пожалуйста, сообщите нам, что заставляет вас думать, что на стороне клиента есть проблема. Что происходит? Любые исключения? Каков результат на стороне клиента и сервера? –

+0

Я отредактировал свой вопрос, чтобы вы могли прочитать, что заставляет меня думать, что на стороне клиента есть проблема. Спасибо за помощь! – jpetrucci

ответ

0

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

Между тем есть несколько вещей, которые не так с кодом вы представили:

  1. Вы нарушаете промышленности приняли стандарты кодирования с такими названиями, как «BuffIn», «В», «IPaddresa» и так на. Все имена переменных в Java должны начинаться с строчной буквы.

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

  2. Поскольку вы всегда пытаетесь прочитать данные о целом буфере, замените in.read(buf, 0, bytecount) на in.read(buf).

  3. Там нет значения в использовании BufferedInputStream или BufferedOutputStream, если вы только собираетесь делать большихread или write звонков на него. Тем более, если вы сообщите потоку использовать буфер того же размера, что и ваш byte[], который вы читаете/пишете.

  4. Как ваш клиентский, так и серверный код могут протекать файловые дескрипторы. На стороне сервера он может протекать in. На клиентской стороне все или все дескрипторы файлов потоков могут протекать.

+0

Я отредактировал свой вопрос, чтобы вы могли прочитать, что заставляет меня думать, что на стороне клиента есть проблема. Спасибо за помощь! – jpetrucci

Смежные вопросы