2014-10-07 3 views
0

Я создаю java-сервер и java-клиент. Мне нужно отправить от сервера к клиенту, а наоборот - объект, а затем массив объектов. Как я могу это достичь? Нужно ли сериализовать классы объектов?Отправить массивы объектов и объектов через сокет

Это сервер:

import java.io.*; 

import java.net.*; 

public class Server extends Thread { 

private final ServerSocket Server; 

public static void main(String[] args) throws Exception { 

    new Server(); 

} 

public Server() throws Exception { 

    Server = new ServerSocket(3000); 

    System.out.println("Server started on port 3000."); 

    this.start(); 

} 

@Override 
public void run() { 

    while (true) {    

     try { 

      System.out.println("Server is listening to new connections..."); 

      Socket client = Server.accept(); 

      System.out.println("Connection accepted from: " + client.getInetAddress()); 

      Connect c = new Connect(client); 

     } catch (IOException exception) { 

      System.out.println(exception.getMessage()); 

     } 

    } 

} 

    class Connect extends Thread { 

    private Socket client = null; 
    BufferedReader in = null; 
    PrintStream out = null; 

    public Connect(Socket clientSocket) { 

     client = clientSocket; 

     try { 

      in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      out = new PrintStream(client.getOutputStream(), true); 

     } catch (IOException mainException) { 

      try { 

       client.close(); 

      } catch (IOException exception) { 

       System.out.println(exception.getMessage()); 

      } 

     } 

     this.start(); 

    } 

    @Override 
    public void run() { 
try { 

out.close(); 
      in.close(); 
      client.close(); 

     } catch (IOException exception) { 

      System.out.println(exception.getMessage()); 

     } 

    } 

} 

Это мой клиент:

import java.io.*; 
import java.net.*; 

public class Client { 

    String remoteAddress = "localhost"; 
    BufferedReader in  = null; 
    PrintStream out   = null; 
    Socket socket   = null; 
    String message   = null; 

    String username   = null; 
    String password   = null; 

    public Client(String username, String password) { 

     this.username = username; 
     this.password = password; 

    } 

    public String connect() { 

     try { 

      // begin a new client connection 
      socket = new Socket(remoteAddress, 3000); 

      // open I-O channels 
      in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      out = new PrintStream(socket.getOutputStream(), true); 

     } catch (Exception exception) { 

      return false; 

      System.out.println(exception.getMessage()); 

     } 

     return "ERROR"; 

    } 

    public boolean disconnect() throws IOException { 

     // close flushes I-O with the server 
     out.close(); 
     in.close(); 

     return true; 

    } 

} 

Это, вместо того, это один класс:

class Contact { 

    private String name; 
    private String surname; 
    private String telephone; 
    private String birthday; 

    public String getName() { 

     return name; 

    } 

    public String getSurname() { 

     return surname; 

    } 

    public String getTelephone() { 

     return telephone; 

    } 

    public String getBirthday() { 

     return birthday; 

    } 

    public void setName(String value) { 

     name = value; 

    } 

    public void setSurname(String value) { 

     surname = value; 

    } 

    public void setTelephone(String value) { 

     telephone = value; 

    } 

    public void setBirthday(String value) { 

     birthday = value; 

    } 

} 

В настоящее время только сервер может передавать данные (массив объектов или только объект) клиенту, но я думаю о том, как сделать это как можно. Кроме того, было бы неплохо отправить объект (например, класс выше), массив одного и того же объекта и массив разных объектов (я не могу получить его с классическими массивами, правильно? Могу ли я использовать ArrayList?)

спасибо.

ответ

2

Что относительно java.io.ObjectOutputStream? попробуйте этот http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html

EDIT: вот пример включен в Javadoc класса -Немного модифицированным, как это было предложено в комментариях:

ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream()); 

oos.writeInt(12345); 
oos.writeObject("Today"); 
oos.writeObject(new Date()); 

oos.close(); 

и должно быть java.io.ObjectInputStream на противоположном боковая сторона.

+0

+1 Если вы используете Object Stream, вы не можете использовать текстовые Reader? Писатели, вы должны использовать поток объектов, чтобы избежать путаницы. –

+0

Альтернативой является использование XMLEncoder/XMLDecoder для сериализации объектов как текста. –

+0

Должен ли я отправлять String так, то? : oos.writeObject (новая строка («моя строка»)) – blurstream

0

Да Вы используете для этого сериализацию. В этом случае вы можете использовать метод ObjectOutpuStream и writeObject(). Поэтому очень просто управлять этим, не думая о подсчете бит и т. Д. http://www.tutorialspoint.com/java/java_serialization.htm

+0

Могу ли я сохранить его в файл, затем открыть его, прочитать и отправить через сокет? – blurstream