2013-03-24 3 views
0

Я новичок в Java. Мне нужно передать содержимое сокета вместе с двойным номером. Моя идея состоит в том, чтобы обернуть эти два поля в пользовательский объект. Поскольку объект File не является сериализуемым, как отправить/recv этот пользовательский объект? Заранее спасибо. PS: Отправляющая сторона решит, нужно ли отправлять файл в соответствии со значением «двойного» номера. Например:Как отправить пользовательский объект с помощью сериализации?

class MyObject{ 
    double number; 
    File file; 
} 

При отправке, логика что-то вроде этого:

MyObject my = new MyObject(); 

if(my.number > 0){ 
    my.file = open_file(aaa.jpg); 
}else{ 
    //Not opening any file 
} 

send(my); 
+2

Объект 'File' в java представляет _path_ файла, ** не ** его содержимое. Вам нужно будет отправить содержимое «FileInputStream» через ваш сокет. –

+0

во-первых, спасибо за внимание. Да. Я знаю. Это всего лишь псевдокод. Идея логики заключается в том, что мне не нужно отправлять файл каждый раз. Это зависит от значения числа. – Way

ответ

-1

Вот краткий пример приложения, которое отправляет данные на себя более Socket с.

public class App { 

    private static final AtomicInteger port = new AtomicInteger(-1); 
    private static final AtomicBoolean read = new AtomicBoolean(true); 

    private static final class SocketReader implements Runnable { 

     @Override 
     public void run() { 
      try { 
       final ServerSocket serverSocket = new ServerSocket(0); 
       System.out.println("Connected on " + serverSocket); 
       synchronized (port) { 
        port.set(serverSocket.getLocalPort()); 
        port.notifyAll(); 
       } 
       while (read.get()) { 
        try (final Socket socket = serverSocket.accept()) { 
         final DataInputStream dis = new DataInputStream(socket.getInputStream()); 
         System.out.println(dis.readDouble());       
         byte[] buffer = new byte[1024]; 
         int numRead; 
         while ((numRead = dis.read(buffer)) != -1) { 
          System.out.print(new String(buffer, 0, numRead, "UTF-8")); 
         } 
        } 

       } 
      } catch (Exception ex) { 
       throw new RuntimeException(ex); 
      } 

     } 
    } 

    private static final class SocketWriter implements Runnable { 

     private final double d; 
     private final File file; 

     public SocketWriter(double d, File file) { 
      this.d = d; 
      this.file = file; 
     } 

     @Override 
     public void run() { 
      try { 
       while (port.get() < 1) { 
        synchronized (port) { 
         port.wait(); 
        } 
       } 
       try (final Socket clientSocket = new Socket("localhost", port.get()); 
         final DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream())) { 
        System.out.println(clientSocket); 
        dos.writeDouble(d); 
        try (final FileInputStream fis = new FileInputStream(file)) { 
         byte[] buffer = new byte[1024]; 
         int bytesRead; 
         while ((bytesRead = fis.read(buffer)) != -1) { 
          dos.write(buffer, 0, bytesRead); 
         } 
        } 
        dos.flush(); 
       } 
      } catch (Exception ex) { 
       throw new RuntimeException(ex); 
      } 
     } 
    } 

    public static void main(String[] args) throws InterruptedException { 
     final double d = 2.35; 
     final File f = new File(new File(System.getProperty("user.home"), "Downloads"), "readme.txt"); 
     final ExecutorService executorService = Executors.newSingleThreadExecutor(); 
     final Future<?> future = executorService.submit(new SocketReader()); 
     new SocketWriter(d, f).run(); 
     read.set(false); 
     executorService.shutdownNow(); 
     try { 
      future.get(); 
     } catch (ExecutionException ex) { 
      throw new RuntimeException(ex); 
     } 
    } 
} 

Сначала мы посылаем double сериализации, то он посылает содержимое случайного файла в моем каталоге Downloads.

Другой Thread, между тем, эхо все, что на консоли.

+0

спасибо. Я также знаю, что можно отправить два поля таким образом. Но дело в том, как обернуть его в пользовательский объект. – Way

+0

Вы всегда можете прочитать свой 'Файл' в' String' или 'byte []' и отправить его, что потребует хранения всего файла в памяти, однако - немного дорого. Из вашего комментария - читатель может закрыть поток, если он не хочет «Файл» ... –

+0

Привет. Я запустил ваш код. Он работал, когда файл readme.txt. Когда я заменил его на a.jpg, это не сработало. Читатель был заблокирован в 'line = bufferedReader.readLine()'. Не могли бы вы рассказать мне, как его решить? – Way

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