Сокет сериализации Java - PullRequest
0 голосов
/ 04 мая 2018

Целью моей работы является внедрение совместной и распределенной вычислительной платформы. Действительно, идея состоит в том, чтобы позволить клиенту выполнять операцию одного из этих классов через сервер. Я использую для этого сериализацию. Все идет хорошо для передачи класса и когда я выполняю операцию, но когда я хочу вернуть результат клиенту, ничего не происходит, и я не понимаю, почему. Будет ли у кого-нибудь объяснение, чтобы дать мне? :)

спасибо,

public class Client {

    public static void main(String[] zero) {

        Socket socket;

        try {

            // on ouvre la connexion
            System.out.println("Création du socket de la part du client");
            socket = new Socket(InetAddress.getLocalHost(), 2009);

            System.out.println("Début de la sérialization du client ");

            ObjectOutputStream oos = null;

            try {
                // création du fichier avec la classe FileOutputStream
                final FileOutputStream fichier = new FileOutputStream("calcul.ser");

                // le résultat de la serialization est envoyé dans le fichier
                oos = new ObjectOutputStream(fichier);

                // création d'un objet à sérializer
                Calcul calc = new Calcul("1", "6");

                // sérialization de l'objet et envoi
                oos.writeObject(calc);

                // on vide le tampon
                oos.flush();


            } catch (final java.io.IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (oos != null) {
                        oos.flush();
                        oos.close();
                    }
                } catch (final IOException ex) {
                    ex.printStackTrace();
                }
            }

            BufferedReader inFromUser =
                    new BufferedReader(new InputStreamReader(System.in)); 

            BufferedReader inFromServer =
                    new BufferedReader(new
                    InputStreamReader(socket.getInputStream())); 

            String resultat = inFromServer.readLine(); 

            System.out.println("FROM SERVER: " + resultat); 

            socket.close();

        } catch (UnknownHostException e) {

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

            e.printStackTrace();
        }
    }



}


public class Serveur {

    public static void main(String[] zero) {

        ServerSocket socketserver;
        Socket socketduserveur;
        String resultat = null;

        try {
            // connexion au client
            socketserver = new ServerSocket(2009);

                socketduserveur = socketserver.accept();

                //on lance la deserialization 
                ObjectInputStream ois = null;

                try {

                    // création du fichier avec FileInputStream
                    final FileInputStream fichier = new FileInputStream("calcul.ser");

                    // le résultat de la déserialization est envoyé dans le fichier 
                    ois = new ObjectInputStream(fichier);

                    // on stock dans calcul l'objet deserializé
                    final Calcul calcul = (Calcul) ois.readObject();

                    //on additionne les deux nombre dans la classe calcul
                     resultat = String.valueOf(calcul.Addition());

                    System.out.println("le resultat de l'addition au niveau du serveur est :" + calcul.getResultat());


                } catch (final java.io.IOException e) {
                    e.printStackTrace();
                } catch (final ClassNotFoundException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        if (ois != null) {
                            ois.close();
                        }
                    } catch (final IOException ex) {
                        ex.printStackTrace();
                    }
                }


                DataOutputStream outToClient =
                        new DataOutputStream(socketduserveur.getOutputStream());

                outToClient.writeBytes(resultat); 


            socketserver.close();
            socketduserveur.close();

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

}

import java.io.Serializable;

//création de notre classe sérializable
public class Calcul implements Serializable {

    // les objets int sont sérializables pas de soucis 
    private String nombre1,nombre2;
    private int resultat;

    //création du constructeur
    public Calcul (String nombre1, String nombre2) {
        this.nombre1=nombre1;
        this.nombre2=nombre2;
    }

    //création de la méthode addition qui va être exécutée sur le serveur
    public int Addition() {
        int x = Integer.parseInt(nombre1);
        int y = Integer.parseInt(nombre2);
        resultat = x+y;
        return resultat;
    }

    public int getResultat() {
        return resultat;
    }

}

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

У вас есть выход на вашей консоли serveur? Потому что я вижу, что вы делаете sysout на вашем сервере. И результат передается как String. Я думаю, вам нужно привести его к байту, прежде чем делать outToClient.writeBytes(resultat);, потому что это writeBytes. Я могу вспомнить, есть ли что-то для непосредственного написания строк, но попробуйте привести вашу переменную resultat в байтах и ​​добавить сброс

0 голосов
/ 04 мая 2018

Проблема решена!

Я просто поместил thread.sleep (2000) в конце моего класса serveur и client. Я думаю, что я не мог видеть system.out.println моего клиента, потому что он был открыт Serveur !!

Большое спасибо, счастливого кодирования:)

0 голосов
/ 04 мая 2018

вы никогда не вызывали outToClient.flush ().

Я бы также сказал, что вы агрессивно закрываете сокет (вызывая TCP RST), потому что вы не закрываете потоки сокета (TCP FIN). Это не оставляет шансов ОС сбросить пакеты, даже если вы вызвали сброс. Правильный способ - очистить, закрыть потоки, затем закрыть сокет. Кроме того, только один должен инициировать закрытие, другой должен обнаружить EOF и затем продолжить его закрытие. В противном случае у вас есть 2 пира, готовых к зависанию, что может привести к отсутствию данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...