Socket : charger ip depuis fichier

cs_Shinji Messages postés 10 Date d'inscription vendredi 13 décembre 2002 Statut Membre Dernière intervention 6 février 2005 - 11 janv. 2005 à 16:13
cs_Bl0tCh Messages postés 74 Date d'inscription dimanche 2 novembre 2003 Statut Membre Dernière intervention 6 septembre 2008 - 15 janv. 2005 à 15:53
Bonjour @ ttes et @ ts,



voici mon pb:



j'essaye de faire une petite app client/serveur et j'aimerais
pouvoir enregister l'ip/port du serveur dans un fichier pour pouvoir la
réutiliser la prochaine fois que j'ouvre mon client



Je sais écrire et lire ces infos dans un fichier, mais au moment de les utiliser pour me connecter

il me sort une erreur ou je ne sais simplement rien envoyer.

Comment faire ?



Merci d'avance !



Précisions : je suis sous XP, j'ai Python 2.3.4 et j'utilise wxPython pour le visuel.

Le fichier InitsCli.txt contient ces 3 lignes:



###

192.168.0.1

50505

1024

###



voici le code client ( le code serveur est sensiblement similaire



#########################Début du code



from socket import *

from wxPython.lib.evtmgr import eventManager

from wxPython.wx import *



import Queue

import threading

import wx

import wx.lib.newevent



WINDOW_Height = 600

WINDOW_Width = 800



(ReceivedData, EVT_RCVD_DATA) = wx.lib.newevent.NewEvent()



class ConnectionManager (threading.Thread):

def __init__ (self,Fenetre):

threading.Thread.__init__ (self, target=self.run)

self.Fenetre = Fenetre

self.Socket = socket (AF_INET,SOCK_DGRAM)

self.FOptions = open ("InitsCli.txt",'rb')

self.Options = self.FOptions.readlines ()

self.FOptions.close ()

self.Socket_Buffer = int(self.Options[2])

self.Socket_Host = self.Options[0]

self.Socket_Port = int(self.Options[1])

self.Socket.connect
((self.Socket_Host,self.Socket_Port)) <<LA OU CA
COINCE>>

def run (self):

while 1:

Donnee = self.Socket.recv (self.Socket_Buffer)

if Donnee:

Event = ReceivedData (value=Donnee)

wx.PostEvent (self.Fenetre,Event)

def Send (self,String):

self.Socket.send (String)

def Stop (self):

if self.Socket:

self.Socket.send ("/clientexit/")

self.Socket.close ()



class Fenetre_Options_Client (wxFrame):

def __init__ (self, parent, ID, title,
pos=wx.DefaultPosition, size=wx.DefaultSize,
style=wx.DEFAULT_FRAME_STYLE):

wx.Frame.__init__ (self, parent, ID, title, pos, size, style)

Fenetre = wx.Panel (self, -1)

#Controles

wx.StaticText (Fenetre, -1, "Serveur :", (20, 10))

wx.StaticText (Fenetre, -1, "Port :", (20, 30))

wx.StaticText (Fenetre, -1, "Buffer :", (20, 50))

self.TextHost = wxTextCtrl
(Fenetre, -1, "", pos=(120,10), size=wxDefaultSize,
style=wxTE_PROCESS_ENTER)

self.TextPort = wxTextCtrl
(Fenetre, -1, "", pos=(120,30), size=wxDefaultSize,
style=wxTE_PROCESS_ENTER)

self.TextBuffer = wxTextCtrl
(Fenetre, -1, "", pos=(120,50), size=wxDefaultSize,
style=wxTE_PROCESS_ENTER)

self.TextHost.SetEditable (True)

self.TextPort.SetEditable (True)

self.TextBuffer.SetEditable (True)

#Boutons

self.BtnAnnuler = wx.Button (Fenetre, 1001, "Annuler")

self.BtnOk = wx.Button (Fenetre, 1002, "Ok")

self.BtnAnnuler.SetPosition ((20, 80))

self.BtnOk.SetPosition ((140, 80))

#Events

self.Bind (wx.EVT_BUTTON, self.OnAnnuler, self.BtnAnnuler)

self.Bind (wx.EVT_BUTTON, self.OnOk, self.BtnOk)

self.Bind (wx.EVT_CLOSE, self.OnCloseWindow)

self.Bind (wx.EVT_TEXT_ENTER, self.OnOk, self.TextHost)

self.Bind (wx.EVT_TEXT_ENTER, self.OnOk, self.TextPort)

self.Bind (wx.EVT_TEXT_ENTER, self.OnOk, self.TextBuffer)

#Chargement des valeurs

self.FOptions = open ("InitsCli.txt",'r')

self.Options = self.FOptions.readlines ()

self.FOptions.close ()

self.TextHost.SetValue (self.Options[0])

self.TextPort.SetValue (self.Options[1])

self.TextBuffer.SetValue (self.Options[2])

#Derniers reglages

self.BtnAnnuler.SetFocus ()

self.CenterOnScreen ()

def OnAnnuler (self,event):

self.Close ()

def OnOk (self,event):

self.FOptions = open ("InitsCli.txt",'w+')

self.Options[0] = self.TextHost.GetValue ()

self.Options[1] = self.TextPort.GetValue ()

self.Options[2] = self.TextBuffer.GetValue ()

self.FOptions.writelines (self.Options)

self.FOptions.close ()

self.Close ()

def OnCloseWindow (self,event):

self.Destroy ()



class Fenetre_Principale (wxFrame):

#Initialisation fenetre

def __init__ (self, parent, id, title):

wxFrame.__init__ (self, parent, -1, title, size=(WINDOW_Width,WINDOW_Height))

#Menu

menuBar = wx.MenuBar ()

menuFichier = wx.Menu ()

menuFichier.Append (101, "&Quitter")

menuBar.Append(menuFichier, "&Fichier")

menuOptions = wxMenu ()

menuOptions.Append (201, "&Client")

menuBar.Append(menuOptions, "&Options")

self.SetMenuBar(menuBar)

self.Bind(wx.EVT_MENU, self.OnClose, id=101)

self.Bind(wx.EVT_MENU, self.MenuOptionsClient, id=201)

#Controles

self.ConsoleText =
wxTextCtrl (self, -1, "", pos=(0,0),
size=(WINDOW_Width-10,WINDOW_Height-66),
style=wxTE_READONLY|wxTE_MULTILINE)

self.CommLine = wxTextCtrl
(self, -1, "", pos=(0,WINDOW_Height-66), size=(WINDOW_Width-10,20),
style=wxTE_PROCESS_ENTER)

#Events

self.CommLine.Bind (wx.EVT_CHAR, self.ConsoleChar)

self.Bind (wx.EVT_CLOSE, self.OnCloseWindow)

self.Bind (wx.EVT_TEXT_ENTER, self.Console, self.CommLine)

self.Bind(EVT_RCVD_DATA, self.OnReceivedData)

#Events Manager

eventManager.Register (self.OnResize, wx.EVT_SIZE, self)

#Historique de la console

self.ConsoleHistorique = []

self.ConsoleHistoriqueNmro = 0

#Manager de connection

self.ConnectionManager = ConnectionManager (self)

self.ConnectionManager.start ()

#Dernier reglages et Affichage

self.CommLine.SetFocus ()

self.CenterOnScreen ()

self.Show ()



self.FOptions = open ("InitsCli.txt",'r')

self.Options = self.FOptions.readlines ()

self.FOptions.close ()

self.ConsoleText.AppendText ("\n%s"%self.Options[0])

#Methodes

def Console (self,event):

self.string = event.GetString ()

self.ConsoleHistorique.append (self.string)

self.ConsoleHistoriqueNmro = len (self.ConsoleHistorique)

self.ConsoleText.AppendText ("\n%s" % self.string)

self.CommLine.Clear ()

if self.string == "" : return

if self.string[0] == '/' :

if self.string == "/clearhistoric":

self.ConsoleHistorique = []

self.ConsoleHistoriqueNmro = 0

elif
self.string == "/historic": self.ConsoleText.AppendText ("\n%s" %
self.ConsoleHistorique)

elif self.string == "/quit": self.Close ()


else: self.ConsoleText.AppendText ("Commande non reconnue : %s" %
self.string)

else: self.ConnectionManager.Send (self.string)

def ConsoleChar (self, event):

if event.GetKeyCode () == 317:

self.ConsoleHistoriqueNmro -= 1

if self.ConsoleHistoriqueNmro < 0:

self.ConsoleHistoriqueNmro = 0

event.Skip ()

elif event.GetKeyCode () == 319:

self.ConsoleHistoriqueNmro += 1

if
self.ConsoleHistoriqueNmro > len (self.ConsoleHistorique) + 1:


self.ConsoleHistoriqueNmro = len (self.ConsoleHistorique)

event.Skip ()

if
self.ConsoleHistoriqueNmro > -1 and self.ConsoleHistoriqueNmro <
len (self.ConsoleHistorique):


self.CommLine.SetValue
(self.ConsoleHistorique[self.ConsoleHistoriqueNmro])

event.Skip ()

def MenuOptionsClient (self,event):

FenetreClient =
Fenetre_Options_Client (self, -1, "Options Client", size=(240,
140),style = wx.DEFAULT_FRAME_STYLE)

FenetreClient.Show (True)

def OnClose (self,event):

self.ConnectionManager.Stop ()

self.Close (True)

def OnCloseWindow (self,event):

self.ConnectionManager.Stop ()

self.Destroy ()

def OnReceivedData (self,event):

self.ConsoleText.AppendText ("\n%s" % event.value)

def OnResize (self, event):

self.CenterOnScreen ()



class Client (wxApp):

def OnInit (self):

Fenetre = Fenetre_Principale ( None, -1, "Client" )

self.SetTopWindow ( Fenetre )

return True



App = Client (0)

App.MainLoop ()



#########################Fin du code


Python, ça ne commencerai pas par la même lettre que Pur et Plaisir ? ^_^

4 réponses

cs_Shinji Messages postés 10 Date d'inscription vendredi 13 décembre 2002 Statut Membre Dernière intervention 6 février 2005
14 janv. 2005 à 23:09
C'est bon les amis, le pb c'est qu'il faut que les adresses utilisées soient les mêmes.

Je m'explique : si le serveur écoute sur ('localhost':25252) et le
client se connecte sur (192.168.0.55:25252) (par ex) et même si l'ip
locale est 192.168.55 il n'arriveront pas à se connecter

il faut que les 2 adresses soient parfaitement identique. Soit (192.168.0.55:25252), soit ('localhost':25252) pour les deux.


____________________________________________________________
Python, ça ne commencerai pas par la même lettre que Pur et Plaisir ? ^_^
0
cs_Bl0tCh Messages postés 74 Date d'inscription dimanche 2 novembre 2003 Statut Membre Dernière intervention 6 septembre 2008
15 janv. 2005 à 14:03
met toi en ecoute sur l'ip 0.0.0.0 et ce sera bon ;)
0
cs_Shinji Messages postés 10 Date d'inscription vendredi 13 décembre 2002 Statut Membre Dernière intervention 6 février 2005
15 janv. 2005 à 14:12
L'ip 0.0.0.0 ? Cette ip me permettrai de communiquer avec des clients
qui cherchent à se connecter sur 'localhost' et l'ip réseau
(192.168.0.55) ?



Je vais essayer ça tiens ! Merci ! ^_^

____________________________________________________________

Python, ça ne commencerai pas par la même lettre que Pur et Plaisir ?
0
cs_Bl0tCh Messages postés 74 Date d'inscription dimanche 2 novembre 2003 Statut Membre Dernière intervention 6 septembre 2008
15 janv. 2005 à 15:53
Oui comme ça il ecoute sur nimporte quelle ip qui mene à lui, dc l'ip du reseau local, 127.0.0.1 ou l'ip que ta sur internet
0