Почему мои экземпляры ObjectInput / OutputStrem не создаются? - PullRequest
0 голосов
/ 02 апреля 2020

Я изучаю сокеты и делаю короткий пример того, как отправлять сериализуемые объекты через java сокетов. Проблема в том, что когда я копирую оба входных и выходных потока (ObjectOutputStream и ObjectInputStream). Программа не будет продолжать курс. Я хочу обменять объект из класса User, который я создал на сервере и клиенте.

Это моя серверная программа:

public class Main {

    public static void main(String[] args) throws IOException, ClassNotFoundException {

        ServerSocket server = new ServerSocket(3333);

        Socket client = server.accept();

        ObjectInputStream objectInput = new ObjectInputStream(client.getInputStream());
        ObjectOutputStream objectOutput = new ObjectOutputStream(client.getOutputStream());

        System.out.println("Instances created");     //Doesn't print on execution

        User user = (User)objectInput.readObject();
        System.out.println(user.toString());

        client.close();
        server.close();
    }
}

А это клиентская программа:

public class Main {

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

        Socket server = new Socket("here I wrote my IP", 3333);
        User user = new User("Me", "me@gmail.com", 20);

        ObjectInputStream objectInput = new ObjectInputStream(server.getInputStream());
        ObjectOutputStream objectOutput = new ObjectOutputStream(server.getOutputStream());

        System.out.println("Instances created");    //Doesn't print on execution

        objectOutput.writeObject(user);

        server.close();
    }
}

Когда я запускаю сервер, клиент, обе программы продолжают выполняться, но на консоли ничего не отображается. Даже System.out.println("Instances created");.

Почему? Я что-то не так делаю?

Если вам интересно, класс User выглядит так:

public class User implements Serializable {
    private String name;
    private String email;
    private int edad;

    public User (String name, String email, int edad) {
        this.name = name;
        this.email = email;
        this.edad = edad;
    }

    @Override
    public String toString() {
        return name + " (" + email + "), " + edad + " años";
    }
}

1 Ответ

1 голос
/ 02 апреля 2020

Во-первых, не используйте Java Сериализации, поскольку это опасно .

ObjectInputStream заблокирует попытку чтения заголовка как на клиенте, так и на сервере. Вы должны увидеть это по следам стека.

...