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;

    }

}

代わりに、これは 1 つのクラスです。

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よろしいですか?)を送信するとよいでしょう。

ありがとうございました。

4

2 に答える 2

2

java.io.ObjectOutputStream はどうですか?これを試してくださいhttp://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html

編集: コメントで提案されているように、クラスの javadoc に含まれている例を少し変更します。

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

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

oos.close();

反対側に java.io.ObjectInputStream があるはずです。

于 2014-10-07T21:10:18.410 に答える
0

はい、そのためにシリアル化を使用する必要があります。その場合、 ObjectOutpuStream と writeObject() メソッドを使用できます。したがって、ビットのカウントなどを考えずにこれを管理するのは非常に簡単です。 http://www.tutorialspoint.com/java/java_serialization.htm

于 2014-10-07T21:16:01.377 に答える