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 ? ^_^
Afficher la suite