Tcp/IP-Grafische Oberfläche

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

Tcp/IP-Grafische Oberfläche

Beitragvon Musti » 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:

Beitragvon Hillkorn » 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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder