Tcp/IP-Grafische Oberfläche

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Musti
User
Beiträge: 5
Registriert: Montag 21. Juli 2008, 10:43

Freitag 1. August 2008, 12:13

Hallo Leute,

sicherlich kennt jeder von Euch das Chatbeispiel mit dem Client- und Serverprogramm.

Meine Frage:

Hat schon jemand zu dem Python Chatbeispiel eine grafische Oberfläche programmiert, in dem man die IP-Adresse und Nachricht ein gibt und auch Nachricht wieder erhält?

Ich würde mich freuen, wenn Ihr mir helfen könnt.

hier das Beispiel:
http://www.galileocomputing.de/openbook ... 0a8629087d
Hillkorn
User
Beiträge: 12
Registriert: Samstag 19. Januar 2008, 19:31
Kontaktdaten:

Sonntag 10. August 2008, 10:34

Ja hab sowas mal gemacht aber nicht fertig und war auch so das erste was ich in Python gemacht hatte also nicht wundern ;)

hab 3 datein eine davon ist auf einen server .... bei mir Funpic.de weils kostenlos ist ^^

also der server:

Code: Alles auswählen

import socket
import select
from ftplib import FTP
import urllib


server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("", 51000))
server.listen(10)
clients = []

try:
    f = urllib.urlopen('URL zur PHP IP site')
    for zeile in f:
        sip = str(zeile)
    f.close()
except:
    print 'IP konnte nicht ermittelt werden!'


try:
    f = open('ip.txt', 'w')
    f.write(sip)
    f.close()
    f = open('ip.txt', 'r')
    fip = FTP('FTP ADDR')
    fip.login("USER", "PW")
    fip.storlines("STOR ip.txt", f)
    fip.quit()
    f.close()
except:
    print "Fehler beim IP versenden!"
else:
    print 'IP wurde gegeben'

command = raw_input()

user = {}
userlist = []
userlogin = {}

try:
    userdat = open('user.dat', 'r')
    for line in userdat:
        line2 = line.split(':')
        userlogin = {line2[1] : line[2]}
    userdat.close()
except:
    userdat = open('user.dat', 'w')
    userdat.close()
    
def usersend(users,clients):
    usertext = ''
    for user in users:
        print user
        usertext += '|'+user
    usertext += '|'
    for client in clients:
        client.send('-user'+usertext)


if command == "start":
    try:
        while True:
            lesen, schreiben, oob = select.select([server] + clients, [], [])
            for sock in lesen:
                if sock is server:
                    client, addr = server.accept()
                    clients.append(client)
                    print "+++ Client %s verbunden" % addr[0]
                else:
                    try:
                        nachricht = sock.recv(1024)
                    except:
                        print "Eine Verbindung wurde abgebrochen!"
                        userlist.remove(user[sock])
                        clients.remove(sock)
                    else:
                        ip = sock.getpeername()[0]
                        if nachricht != "-close":
                            msg = nachricht.split('|')
                            if msg[0] == "-chat":
                                s = "%s: %s" % (user[sock], msg[1])
                                print s
                                for csend in clients:
                                    csend.send(user[sock]+': '+msg[1])

                            if msg[0] == '-login':
                                if msg[1] in userlogin:
                                    if userlogin[msg[1]] == msg[2]:
                                        user = {sock : msg[1]}
                                    for csend in clients:
                                        csend.send(msg[1] + " connected zum Server")
                                        #csend.send('-useradd|'+msg[1])
                                        print msg[1] + " logged in"
                                else:
                                    user = {sock : msg[1]}
                                    userlogin = {msg[1] : msg[2]}
                                    userdat = open('user.dat', 'w')
                                    userdat.write(msg[1]+':'+msg[2])
                                    userdat.close()
                                userlist.append(msg[1])
                                usersend(userlist,clients)

                        else:
                            print "+++ Verbindung zu %s beendet" % ip
                            userlist.remove(user[sock])
                            sock.close()
                            clients.remove(sock)
    finally:
        for c in clients:
            c.close()
        server.close()
Client

Code: Alles auswählen

#Main.py
#created by Hillkorn
        
import wx
import socket
import time
import threading
import thread
import urllib
import time
        
        
class cmwindow(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, 'Messenger', wx.DefaultPosition, wx.Size(400,400))
        
        #Variablen
        self.einstellungen = {"Acc" : "",
                              "PW"  : ""}
        self.isconnect = False
        self.ifip = True
        try:
            f = urllib.urlopen('URL zur IP TXT')
            for zeile in f:
                self.ip = str(zeile)
            f.close()
        except:
            self.ip = ""        
        try:
            f = open("einstellungen.dat", "r")
        except:
            f = open("einstellungen.dat", "w")
        else:
            for line in f:
                vars = line.strip()
                vars = vars.split(" ")
                self.einstellungen[vars[0]] = vars[1]
            f.close()
        
        
        
        #MenuBar
        menubar = wx.MenuBar()
            
        programm = wx.Menu()
        einstellungen = wx.Menu()
        help = wx.Menu()
        
        programm.Append(105,'&Quit\tCtrl+Q', 'Quit the Application')
        self.Bind(wx.EVT_MENU, self.onQuit, id=105)
        einstellungen.Append(110,'Benutzer', 'Benutzerdaten')
        einstellungen.Append(111,'Get Server IP', 'IP Adresse holen')
        self.Bind(wx.EVT_MENU, self.onBenutzer, id=110)
        self.Bind(wx.EVT_MENU, self.onGetip, id=111)
        menubar.Append(programm,'&Programm')
        menubar.Append(einstellungen, '&Einstellungen')
        menubar.Append(help, '&Hilfe')                
        self.SetMenuBar(menubar)
        self.CreateStatusBar()
        
        
        
        #FensterInhalt
        box1 = wx.BoxSizer(wx.HORIZONTAL)
        box2 = wx.BoxSizer(wx.HORIZONTAL)
        box3 = wx.BoxSizer(wx.VERTICAL)
        
        panel = wx.Panel(self, -1)
        #panel2 = wx.Panel(panel, -1, size=(210,35))
        
        
        #text widgets
        self.text = wx.TextCtrl(panel, -1, style= wx.TE_READONLY | wx.TE_MULTILINE) 
        box1.Add(self.text, 2, wx.BOTTOM | wx.RIGHT | wx.EXPAND, 10)
        
        self.etext = wx.TextCtrl(panel, -1, style= wx.TE_MULTILINE)
        box2.Add(self.etext, 1, wx.EXPAND |wx.RIGHT, 10)
        
        #userliste
        self.list = wx.ListCtrl(panel, -1, style=wx.LC_REPORT)
        self.list.InsertColumn(0, 'User')
        self.list.InsertColumn(1, 'Status')
        #self.list.SetColumnWidth(0, 150)
        #self.list.SetColumnWidth(0, 150)
        #self.list.InsertStringItem(0,'User')
        #self.list.SetStringItem(0,1,'Status')
        box1.Add(self.list, 1, wx.EXPAND | wx.RIGHT | wx.BOTTOM, 10)
        
        #buttons
        boxb = wx.BoxSizer(wx.VERTICAL)
        btn = wx.Button(panel, 11,"Senden")
        boxb.Add(btn, 0, wx.RIGHT, 5)
        btn = wx.Button(panel, 12,"Clear")
        boxb.Add(btn, 0)
        self.btnconnect = wx.Button(panel, 13,"Connect")
        boxb.Add(self.btnconnect, 0)
        self.Bind(wx.EVT_BUTTON, self.onSend, id= 11)
        self.Bind(wx.EVT_BUTTON, self.onClear, id= 12)
        self.Bind(wx.EVT_BUTTON, self.onConnect, self.btnconnect)
        box2.Add(boxb, 0)
        
        
        box3.Add(box1, 1, wx.EXPAND)
        box3.Add(box2, 0, wx.EXPAND)
        
        panel.SetSizer(box3)
        
        
    def onQuit (self, event):
        if self.isconnect is True:
            self.socket.send("-close")
            self.socket.close()
        #time.Sleep(2000)
        self.Close()
            
    def onBenutzer(self, event):
        bdialog = cbenutzer(self)
        
    def onGetip(self, event):
        f = urllib.urlopen('URL ZUR IP TXT')
        for zeile in f:    
            self.ip = str(zeile)
        f.close()
            
    def empf(self):
        while self.isconnect:
            try:
                msg = self.socket.recv(1024)+"\n"
                usersplit = msg.split('|')
                if '-user' == usersplit[0]:
                    usersplit.remove('-user')
                    usersplit.remove('\n')
                    s = self.list.GetItemCount()
                    #if s > 0:
                    #   s += 1
                    for i in range(s,-1,-1):
                        wx.CallAfter(self.list.DeleteItem, i)
                        pass
                    z = 0
                    for user in usersplit:

                        wx.CallAfter(self.list.InsertStringItem, z, user)
                        z +1
                else:
                    wx.CallAfter(self.text.AppendText, msg)
            except:
                wx.CallAfter(self.text.AppendText, 'iergendein scheiss fehler -.-')
    
    def login(self):
        self.socket.send('-login|'+self.einstellungen["Acc"]+'|'+self.einstellungen["PW"])
    
    def onConnect(self, event):
        if self.isconnect is not True:
            try:
                self.text.AppendText('Verbinde...')
                self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                self.socket.connect((self.ip ,51000))
            except:
                self.text.AppendText('Fehler beim Verbinden! Bitte pruefen sie der 51000 Port frei ist.')
            else:
                self.login()
                self.text.AppendText("Erfolgreich verbunden\n")
                self.btnconnect.SetLabel("Disconnect")
                self.isconnect = True
                thread.start_new_thread(self.empf, ())
        else:
            try:
                self.socket.send("-close")
                self.socket.close()
            except:
                self.text.AppendText("Fehler beim Beenden der Verbindung!")
            else:
                self.text.AppendText("Erfolgreich getrennt")
                self.btnconnect.SetLabel("Connect")
                self.isconnect = False

    def onSend(self, event):
        if self.isconnect is True:
            self.socket.send("-chat|"+self.etext.GetValue())
            self.etext.SetValue("")
        else:
            self.text.AppendText('Sie sind nicht mit dem Server Verbunden!')
    
    def onClear(self, event):
        self.etext.SetValue("")
                    
    
class cbenutzer(wx.Dialog):
    def __init__(self, parent):
        wx.Dialog.__init__(self, parent, -1, "Benutzer Daten", wx.DefaultPosition, wx.Size(200,130))
        self.einstellungen = parent.einstellungen
        if parent.ip:
            self.ip = parent.ip
        
        box = wx.BoxSizer(wx.VERTICAL)
        boxacc = wx.BoxSizer(wx.HORIZONTAL)
        boxpw = wx.BoxSizer(wx.HORIZONTAL)
        
        st = wx.StaticText(self, 10, "Account: ")
        self.acc = wx.TextCtrl(self, -1)
        self.acc.SetValue(parent.einstellungen["Acc"])
        if self.einstellungen["PW"] == "":
            self.pw.SetValue("default")
        boxacc.Add(st, 0)
        boxacc.Add(self.acc, 1, wx.LEFT, 30)
        box.Add(boxacc, 0)
        
        st = wx.StaticText(self, 11, "Passwort: ")
        self.pw = wx.TextCtrl(self, -1, style= wx.TE_PASSWORD)
        self.pw.SetValue(parent.einstellungen["PW"])
        if self.pw.GetValue == "":
            self.pw.SetValue("default")
        boxpw.Add(st, 0)
        boxpw.Add(self.pw, 1, wx.LEFT | wx.BOTTOM, 25)
        box.Add(boxpw, 0)
                
        buttons = self.CreateButtonSizer(wx.OK | wx.CANCEL)
        box.Add(buttons, 0, wx.ALIGN_CENTRE)
        
        self.Bind(wx.EVT_BUTTON, self.onOK, id= wx.ID_OK)
        self.Bind(wx.EVT_BUTTON, self.onCancel, id= wx.ID_CANCEL)
        self.SetSizer(box)
        self.Show(True)
        
    def onOK(self, event):
        self.einstellungen["Acc"] = str(self.acc.GetValue())
        self.einstellungen["PW"] = str(self.pw.GetValue())
        
        f = open("einstellungen.dat", "w")
        for key in self.einstellungen:
            f.write(key + " " + self.einstellungen[key] + "\n")    
        f.close()
        self.Show(False)
        
    def onCancel(self, event):
        self.Show(False)
                
        
class cprogramm(wx.App):
    def OnInit(self):
        frame = cmwindow()
        frame.Show(True)
        return True
        
app = cprogramm()
app.MainLoop()
und die PHP datei

Code: Alles auswählen

<?
$ipadresse ="$REMOTE_ADDR";
echo $ipadresse;
?>
Der server holt sich die IP vom funpic server und schreibt diese per FTP in die ip.txt beim server ... der Client holt sie sich und kann dann connecten
Antworten