IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Socket Java et Handshake


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut Socket Java et Handshake
    Bonjour,

    J'essaie de faire communiquer un programme C++ avec un programme java (sur la même machine), et je regarde un peux comment réagissent les socket. J'utilise boost côté C++ et les classes ServerSocket et Socket du côté Java. Avec une seule Socket pour la lecture et l'écriture, le programme fonctionne bien mais ne gère pas bien certain cas d'envoi simultanés.

    J'ai donc essayé d'ouvrir deux Socket sens unique pour que chaque programme soit le seul à lire ou écrire sur une Socket. mais j'ai une erreur du côté de mon programme boost.

    Voici mon code C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include <iostream>
    #include <boost/asio.hpp>
    #include <boost/array.hpp>
    #include <sstream>
    #include <iomanip>
    #include <fstream>
    #include <iostream>
    #include <stdlib.h> 
    using boost::asio::ip::tcp;	
     
     
    int TAILLE_BUFFER_MAX = 10;
    int main()
    {
    	// Création du service principal et du résolveur
    	boost::asio::io_service ios1, ios2;
    	int tailleNomFic;;
     
    	// On veut se connecter sur la machine locale, port 1706
    	tcp::endpoint endpoint1(boost::asio::ip::address::from_string("127.0.0.1"), 1706);
    	tcp::endpoint endpoint2(boost::asio::ip::address::from_string("127.0.0.1"), 1704);
     
    	// On crée une socket // (1)
    	tcp::socket socket1(ios1);
    	tcp::socket socket2(ios2);
     
    	// Tentative de connexion, bloquante // (2)
        socket1.connect(endpoint1);
    	socket2.connect(endpoint2);
     
    	for(int i=0; i<TAILLE_BUFFER_MAX; i++)
    	{
    		tailleNomFic = i;
    		tailleNomFic = ntohl(tailleNomFic);
     
    		//envoi simple d'entier
    		socket1.send(boost::asio::buffer(&tailleNomFic, sizeof(tailleNomFic)));
    		//sleep(1);
    	}	
    	//réception d'un entier
    	int entier;
     
     
    	for(int i=0; i<TAILLE_BUFFER_MAX; i++)
    	{
     
    		socket2.receive(boost::asio::buffer(&entier, sizeof(int)));	
    		std::cout << "test entier 2 "<< ntohl((int)entier) << std::endl; 
    		//sleep(1);
    	}		
    	return 0;
    }
    Et voici mon code Java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    import java.io.*;
    import java.net.*;
     
    public class Socket {
       static final int port1 = 1706;
       static final int port2 = 1704;
     
       public static void main(String[] args) throws Exception {
            ServerSocket s1 = new ServerSocket(port1);
            java.net.Socket soc1= (java.net.Socket) s1.accept();
            ServerSocket s2 = new ServerSocket(port2);
            java.net.Socket soc2= (java.net.Socket) s2.accept();
     
            DataInputStream dis = new DataInputStream(soc1.getInputStream());
            DataOutputStream dos = new DataOutputStream(soc2.getOutputStream());
           int valeur = 100;
           for (int i = 0 ; i < 10 ; i++)
           {
     
        	   dos.writeInt(valeur);
        	   valeur--;
           }
     
    	   for (int i = 0 ; i < 10 ; i++)
           {
    		    int ci =  dis.readInt();
    			System.out.println(ci);
           }
    		dis.close();
    		dos.close();
            soc1.close();
            soc2.close();
       }
    }
    les messages d'erreurs sont :

    soit
    terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
    what(): Connection refused
    Abandon

    soit
    terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >'
    what(): Connection reset by peer
    Abandon

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Les exceptions sont levées lors de la connexion ?

    MAT.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    Ces exceptions se lancent dès l'exécution du programme C++ (le programme Java étant déjà en attente).

    Et du côté Java, j'ai une EOFException qui est lancée.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    L'exception Java est lancée sur la ligne de déclaration du DataOutPutStream, comme si la déclaration avec la socket d'écriture ne passait pas à l'exécution...

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Je me demande s'il n'y a pas un handshake en Java pour certains types de streams, avec du coup des données envoyées et/ou attendues.
    Je comptais vérifier avant de répondre mais je n'a pas trop le temps là tout de suite...

    MAT.

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    faudrait déjà qu'on sache à quelle ligne ton programme C++ se plante la gueule.
    A mon avis ton problème est à chercher dans le "Connection refused". Ton client se connecter à une paire address/port où il n'y a pas de serveur en écoute.

    Quand je regarde le code C++, pour ce que j'en lit, tu ouvre deux sockets (1706, 1704) (déjà, pourquoi deux? les sockets, c'est bidirectionnel, t'a pas besoin de deux sockets pour faire de la lectuire/écriture), t"crit sur une, tu lit sur l'autre, et tu fais l'inverse coté java, il devrais pas y avoir de soucis. Est-ce que tu redémarre bien ton serveur java entre chaque test? Pas d'exception coté java?

    Il n'y a aucune forme de Hansshake prévu en java sur les socket ou DataOutputStream, les premiers respenctent le standard vis à vis de TCP/IP et se base de toutes facons sur l'implémentation de l'os, le deuxième n'est qu'un coque qui s'assure de l'ordre des bits dans la communications.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 139
    Par défaut
    Aucune indication sur la ligne où le programme se "plante la gueule" du côté C++. Il y a juste le message d'erreur précédemment posté.

    Je lance bien le serveur Socket java avant d'exécuter mon programme C++. Du côté Java une EOFException se lance en m'indiquant que c'est à la ligne de déclaration du DataOuputStream qu'il y a un souci.

    J'ai constaté certaines erreures en utilisant une seule Socket (quand les 2 programmes écrivent d'abord, et lisent ensuite), mais les erreurs n'étaient peut être pas là où je le pensais, et peut être que c'est vraiment la meilleure solution.

    Merci pour les infos du handshake.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/02/2008, 12h59
  2. Socket java : synchrone ou asynchrone ?
    Par zenux dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 15/01/2008, 09h09
  3. Connexion via Socket JAVA
    Par jihene dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 08/06/2006, 18h50
  4. [Net]socket java
    Par georges25 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 13/02/2006, 16h22
  5. [Net][Débutant(e)] socket c <-> socket java
    Par JulienT dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 25/11/2005, 16h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo