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

Réseau/Web Python Discussion :

Quel port choisir pour une connexion d'ordi à ordi sur internet ?


Sujet :

Réseau/Web Python

  1. #1
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    Juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 300
    Points : 413
    Points
    413
    Par défaut Quel port choisir pour une connexion d'ordi à ordi sur internet ?
    Bonjour,
    J'ai écris 2 petits programmes qui jouent le rôle d'un serveur (avec possibilité de multi-connexion) et d'un client. Outre le fait que je patauge encore un peu et que je n'arrive à envoyer des données que dans un sens (les programmes sont loin d'être parfaits mais j'en fais mon affaire), ces 2 programmes ont pour but final de communiquer d'ordi à ordi au travers le net.
    Serveur :
    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
    from socket import *
    from select import *
    from mes_packages.mes_fonctions import DicoOrd #un dictionnaire de mon invention qui est ordonné et permet d'avoir autre chose que des int et des str en clef
    hote = ''
    port=80
     
    connexion_principale = socket(AF_INET, SOCK_STREAM)
    connexion_principale.bind((hote, port))
    connexion_principale.listen(5)
    print("Le serveur écoute à présent sur le port {}".format(port))
    clients_connectés=DicoOrd()
    while 1 :
    	demandes,wlist, xlist =select([connexion_principale],[],[],0.05)
    	for connexion in demandes:
    		connexion_avec_client, infos_connexion = connexion.accept()
    		ident=connexion_avec_client.recv(1024)
    		ident=ident.decode()
    		clients_connectés[connexion_avec_client]=ident
    		phrase=ident+" entre dans le salon de chat !"
    		print(phrase)
    		#passons à l'envoi aux autres usagés
    		clients=[]
    		if len(clients_connectés) > 1 :
    			for client in clients_connectés.keys():
    				client.send(phrase.encode())
    	for client in clients_connectés.keys() :
    		try:
    			recu=client.recv(1024)
    			print('reçu !')
    			print(recu.decode())
    			for cli in clients_connectés.keys() :
    				cli.send(recu)
    		except : pass
    Client :
    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
    import socket
    import select
     
    hote="45.34.174.140"#j'ai mis n'importe quoi volontairement mais il correspond à l'ordinateur "serveur"
    port=80
    ident=input('Entrez votre identifiant : ')
     
    connexion_avec_serveur = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connexion_avec_serveur.connect((hote, port))
    print("Connexion établie avec le serveur sur le port {}".format(port))
    connexion_avec_serveur.send(ident.encode())
    msg_a_envoyer = b""
    while msg_a_envoyer != b"/fin":
    	try:
    		raise KeyboardInterrupt
    		msg_recu = connexion_avec_serveur.recv(1024)
    		if msg_recu!=b"" :
    			print(msg_recu.decode()) # Là encore, peut planter s'il y a des accents
    	except KeyboardInterrupt:
    		msg_a_envoyer = input("> ")
    		# Peut planter si vous tapez des caractères spéciaux
    		msg_a_envoyer = msg_a_envoyer.encode()
    		# On envoie le message
    		connexion_avec_serveur.send(msg_a_envoyer)
     
    print("Fermeture de la connexion")
    connexion_avec_serveur.close()
    Le problème est que j'ai eu beau tenter des ports différents, le tout marche bien sur le même ordinateur, normalement sur un réseau partageant la même connexion internet (j'avais testé mais j'ai quelque peu changé le code depuis) mais impossible de communiquer avec 2 ordinateurs connectés à internet avec des livebox différentes. Savez-vous ce que je dois faire ? dois prendre un autre port (j'en ai déjà tenté plein) ?
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par stalacta Voir le message
    Le problème est que j'ai eu beau tenter des ports différents, le tout marche bien sur le même ordinateur, normalement sur un réseau partageant la même connexion internet (j'avais testé mais j'ai quelque peu changé le code depuis) mais impossible de communiquer avec 2 ordinateurs connectés à internet avec des livebox différentes. Savez-vous ce que je dois faire ? dois prendre un autre port (j'en ai déjà tenté plein) ?

    Vous avez besoin d'un cours "réseau" IP "classique".
    Vous y apprendriez que les équipements connectes a une LiveBox sont sur un réseau prive de class A, B ou C. et accedent a "Internet" via un "proxy" dont l'adresse IP est négociée avec le fournisseur d’accès.
    C'est cette adresse IP la qu'il faut utiliser pour "accéder" a la livebox depuis Internet. Et il faut aussi déclarer cote LiveBox que les connexion entrantes sur le port X doivent être expédiées a l'ordi Y du réseau prive.

    Vous pouvez toujours tripoter votre code, le problème est "ailleurs"...
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    Juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 300
    Points : 413
    Points
    413
    Par défaut
    Donc récapitulons, chaque box/modem etc... possède une adresse IP qui représente sa plaque d'immatriculation dans le réseau. Un ordinateur connecté à cette livebox possède donc ce même n° d'identification ?
    Admettons que je veuille me connecter à internet (n'importe quel site web), je lance ma requête qui est convertie en adresse IP. Une fois la connexion du serveur qui est ni plus ni moins qu'un ordinateur spécial ou un ordinateur tout court. Ils s'échangent des données, et ferment la connexion.
    Donc si j'entre l'adresse IP d'un ordinateur qui possède mon programme, s'il accepte la demande, on devrait pouvoir s'échanger des données. J'ai loupé quelque chose ?
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Désolé mais ce que vous racontez m'est incompréhensible.
    Si c’était une question de programmation Python, le comportement du programme "suffit" souvent: inutile - pour vous - d’écrire les précisément choses , le code sera la pour éclairer votre problème, quelques soient les mots utilises.

    Les réseaux ne se réduisant pas a du code mais a une architecture, une configuration, de protocoles. Impossible de partager/communiquer sans un minimum de précision (qui passe par un apprentissage).

    Citation Envoyé par stalacta Voir le message
    J'ai loupé quelque chose ?
    Vous faites l'impasse sur le minimum de formation réseau permettant d'exposer clairement ce que vous voulez faire.

    Est ce qu'un forum de programmation Python est le bon endroit pour savoir comment configurer une LiveBox pour ce que vous voulez faire ?

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre averti
    Homme Profil pro
    Développeur en formation
    Inscrit en
    Juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 300
    Points : 413
    Points
    413
    Par défaut
    Et bien j'ai juste un code qui m'a pris beaucoup de temps à écrire et qui marche extraordinairement bien il fait client et serveur à la fois, plein de personnes peuvent se connecter en même temps... mais il ne marche que sur un réseau local...
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    host = '192.168.1.15'
    port = 12056
    import socket, sys, threading
     
    stop_thread_e=False
     
    # Programme principal - Établissement de la connexion :
    connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
    	connexion.connect((host, port))
    	print ("Connexion établie avec le serveur.")
    	class ThreadReception(threading.Thread):
    		def __init__(self, conn):
    			threading.Thread.__init__(self)
    			self.connexion = conn		   # réf. du socket de connexion
     
    		def run(self):
    			global stop_thread_e
    			print('Vous pouvez maintenant poster des messages !')
    			try:
    				while not stop_thread_e:
    					message_recu = self.connexion.recv(250)
    					print ('\n'+message_recu.decode()+'\nVous > ',end='')
    					if message_recu.upper() == "FIN":
    						print("\nClient arrêté. Connexion interrompue.")
    						sys.exit()
    			except :
    				pass
    			# Le thread <réception> se termine ici.
    			# On force la fermeture du thread <émission> :
    			stop_thread_e=True
    			self.connexion.close()
     
    	class ThreadEmission(threading.Thread):
    		def __init__(self, conn):
    			threading.Thread.__init__(self)
    			self.connexion = conn		   # réf. du socket de connexion
     
    		def run(self):
    			while not stop_thread_e:
    				message_emis = input('Vous > ')
    				try : self.connexion.send(message_emis.encode())
    				except :
    					print('\nAncien serveur déconnecté !\nRéinitialisation...\n##############################\n')
    					import Chat#Chat étant le fichier lui-même, une sorte de réinitialisation
    	connexion.send(input('Entrez votre identifiant : ').capitalize().encode())
    	# Dialogue avec le serveur : on lance deux threads pour gérer
    	# indépendamment l'émission et la réception des messages :
    	th_E = ThreadEmission(connexion)
    	th_R = ThreadReception(connexion)
    	th_R.start()
    	th_E.start()
    except :
    	print('Vous êtes le premier arrivé sur ce serveur de chat !')
    	host = ''
    	class ThreadClient(threading.Thread):
    		'''dérivation d'un objet thread pour gérer la connexion avec un client'''
    		def __init__(self, conn):
    			threading.Thread.__init__(self)
    			self.connexion = conn
     
    		def run(self):
    			# Dialogue avec le client :
    			try:
    				while 1:
    					msgClient = self.connexion.recv(250)
    					msgClient=msgClient.decode()
    					if msgClient.upper() == "FIN" :
    						break
    					elif msgClient=='':continue
    					message = "{} : {}".format(self.nom, msgClient)
    					print ('\n'+message+'\nVous > ',end='')
    					# Faire suivre le message à tous les autres clients :
    					for cle in conn_client:
    						if cle != self.nom:	  # ne pas le renvoyer à l'émetteur
    							conn_client[cle].send(message.encode())
    			except : pass
    			# Fermeture de la connexion :
    			self.connexion.close()	  # couper la connexion côté serveur
    			del conn_client[self.nom]		# supprimer son entrée dans le dictionnaire
    			print("Client {} déconnecté :(.".format(self.nom))
    			print('Liste des membres en ligne : '+th_E.nom,*conn_client.keys(),sep=', ',end='\nVous > ')
    			for cle in conn_client:
    				conn_client[cle].send("Client {} déconnecté :(.".format(self.nom).encode()+b'\n'+b'Liste des membres en ligne : '+th_E.nom.encode()+b', '+', '.join(conn_client.keys()).encode())
    			# Le thread se termine ici	
     
    	# Initialisation du serveur - Mise en place du socket :
    	mySocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    	try:
    		mySocket.bind((host, port))
    	except socket.error:
    		print ("La liaison du socket à l'adresse choisie a échoué.")
    		input()
    		sys.exit()
    	mySocket.listen(5)
     
    	# Attente et prise en charge des connexions demandées par les clients :
    	conn_client = {}				# dictionnaire des connexions clients
     
    	################
    	#passons à la partie client de notre serveur
    	class ThreadEmission(threading.Thread):
    		def __init__(self):
    			threading.Thread.__init__(self)
     
    		def run(self):
    			self.nom=input('Entrez votre identifiant : ').capitalize()
    			print('Vous pouvez maintenant poster des messages !\n')
    			while 1:
    				message_emis = input('Vous > ')
    				for connexion in conn_client.values() : connexion.send(self.nom.encode()+b' : '+message_emis.encode())
     
    	th_E = ThreadEmission()
    	th_E.start()
    	while 1:	
    		connexion, adresse = mySocket.accept()
    		# Créer un nouvel objet thread pour gérer la connexion :
    		th = ThreadClient(connexion)
    		th.start()
    		# Mémoriser la connexion dans le dictionnaire : 
    		nom=connexion.recv(10).decode()
    		conn_client[nom] = connexion
    		th.nom=nom
    		# Dialogue avec le client :
    		print(nom+' entre dans le salon de chat !')
    		print('Liste des membres en ligne : '+th_E.nom,*conn_client.keys(),sep=', ',end='\nVous > ')
    		for cle in conn_client:
    			if cle != nom:	  # ne pas le renvoyer à l'émetteur
    				conn_client[cle].send(nom.encode()+b' entre dans le salon de chat !')
    			liste_membres=b'Liste des membres en ligne : '+th_E.nom.encode()+b', '+', '.join(conn_client.keys()).encode()
    			conn_client[cle].send(liste_membres)
    Donc ma question est toute bête : comment créer un socket qui connectera deux ordinateurs n'appartenant pas à un même réseau local afin qu'ils puissent s'échanger des données ?
    Bouddha : Tout n'est qu'illusion en ce bas monde.
    Jésus : Tout est amour divin.
    Einstein : Tout est relatif dans cet espace-temps.
    Moi : Tout est binaire sur ce forum.

Discussions similaires

  1. Quel SGBD choisir pour une petite base de donnée sur clé USB ?
    Par kedare dans le forum Décisions SGBD
    Réponses: 10
    Dernier message: 29/07/2008, 16h31
  2. Réponses: 1
    Dernier message: 16/11/2007, 12h14
  3. Réponses: 10
    Dernier message: 09/11/2006, 15h28
  4. Quel format choisir pour une clé USB : FAT, FAT32 ou NTFS?
    Par NicolasJolet dans le forum Périphériques
    Réponses: 4
    Dernier message: 03/08/2006, 15h02
  5. Quel SGBD choisir pour une gestion clientèle ?
    Par kurkaine dans le forum Décisions SGBD
    Réponses: 15
    Dernier message: 06/10/2005, 13h14

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