server problems (long post)

Maximilian Scherr MaximilianScherr at t-online.de
Mon Mar 4 12:39:56 EST 2002


Hello,

I'm sorry, that i post this here, but i really have no clue why it doesn't
work, how it could work...
so i post my code on the list, and cry for help:) So if anyone can tell me
to get this server(engine) to work I would be very happy.

Here's the hex string the server receives(it's originaly in binary):

fe01025301020304000000004d61780000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000005741303100000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000303636360000000000000000
00000000000000000000000000000000000000000000000000fe6400090300000000fe640009
0300000001fe6400090300000002fe6400090300000003fe6400090300000004fe6400090300
000005fe6400090300000006fe6400090300000007fe6400090300000008fe64000903000000
09fe640009030000000afe640009030000000bfe640009030000000cfe640009030000000dfe
640009030000000efe640009030000000ffe6400090300000010fe6400090300000011fe6400
090300000012fe6400090300000013fe6400090300000014fe6400090300000015fe64000903
00000016fe6400090300000017fe6400090300000018fe6400090300000019fe640009030000
001afe640009030000001bfe640009030000001cfe640009030000001dfe640009030000001e
fe640009030000001ffe6400090300000020fe6400090300000021fe6400090300000022fe64
00090300000023fe6400090300000024fe6400090300000025fe6400090300000026fe640009
0300000027fe6400090300000028fe6400090300000029fe640009030000002afe6400090300
00002bfe640009030000002cfe640009030000002dfe640009030000002efe6400090300

Here's my code:

import os.path
import os
import threading
import SocketServer
import binascii
import string

class Program:
    def Start(self):
        ucisfile = os.path.isfile('uoslserver.cfg')
        pcinfohandler = PCInfoHandler()
        pcinfohandler.CheckFile()
        ohandler = OHandler()
        ohandler.CheckFile()
        if ucisfile == 0:
            ohandler.WriteO('Couldn\'t find uoslserver.cfg!')

        elif ucisfile == 1:
            readuc = open('uoslserver.cfg')
            try:
                address = eval(readuc.readline())
                try:
                    ohandler.WriteO('Starting up...')
                    ihandler = IHandler()
                    serverthread = Server(address)
                    serverthread.setName('serverthread')
                    ihandlerthread = threading.Thread(None, ihandler.ReadI)
                    ihandlerthread.start()
                    serverthread.start()
                    ohandler.WriteO('...finished!')

                except:
                    ohandler.WriteO('...aborted!')

            except:
                ohandler.WriteO('Couldn\'t read uoslserver.cfg')

class OHandler:
    def CheckFile(self):
        ulisfile = os.path.isfile('uoslserver.log')
        if ulisfile == 0:
            writeul = open('uoslserver.log', 'w')
            writeul.close()

        elif ulisfile == 1:
            os.remove('uoslserver.log')
            writeul = open('uoslserver.log', 'w')
            writeul.close()

    def WriteO(self, string):
        writeul = open('uoslserver.log', 'a')
        print string
        writeul.write(string +'\n')
        writeul.close()

class Server(threading.Thread):
    def __init__(self, address):
        self.address = address
        self.serverstate = 1
        threading.Thread.__init__(self, None, self.Start)

    def Start(self):
        server = SocketServer.ThreadingTCPServer(self.address,
RequestHandler)
        while self.serverstate == 1:
            server.handle_request()

    def ShutDown(self):
        pcinfohandler = PCInfoHandler()
        pcinfohandler.SetInfoAll()
        functionhandler = FunctionHandler()
        for op in functionhandler.ListOnlinePlayers():
            op.Close()

        self.serverstate = 0

class RequestHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        clienthandlerthread = ClientHandler(self.request)
        clienthandlerthread.start()

class ClientHandler(threading.Thread):
    def __init__(self, sockobj):
        self.sockobj = sockobj
        threading.Thread.__init__(self, None, self.Recv)

    def Recv(self):
        datahandler = DataHandler()
        while self.sockobj:
            data = self.sockobj.recv(1024)
            returnvalue = datahandler.Start(data, self.sockobj)
            if returnvalue != 0:
                self.setName(returnvalue[0])
                self.pcname = returnvalue[1]
                self.pcpass = returnvalue[2]
                self.pcx = returnvalue[3]
                self.pcy = returnvalue[4]
                self.pcz = returnvalue[5]
                self.pcdir = returnvalue[6]

        pcinfohandler = PCInfoHandler()
        pcinfohandler.SetInfoSingle(self.getName(), self.pcname,
self.pcpass, self.pcx, self.pcy, self.pcz, self.pcdir)
        ohandler = OHandler()
        ohandler.WriteO(self.pcname +' logged off!')

    def Close(self):
        self.sockobj.close()
        pcinfohandler.SetInfoSingle(self.getName(), self.pcname,
self.pcpass, self.pcx, self.pcy, self.pcz, self.pcdir)
        ohandler = OHandler()
        ohandler.WriteO(self.pcname +' logged off!')

class DataHandler:
    def Start(self, data, sockobj):
        converteddata = binascii.b2a_hex(data)
        if converteddata[:4] == 'fe01':
            pcserial = converteddata[8:16]
            pcname = string.replace(converteddata[24:340], '00', '')
            pcname = chr(int(pcname, 16))
            pcpass = string.replace(converteddata[1116:1190], '00', '')
            pcpass = chr(int(pcpass, 16))
            pcinfohandler = PCInfoHandler()
            returnvalue = pcinfohandler.GetInfo(pcserial)
            functionhandler = FunctionHandler()
            ohandler = OHandler()
            if returnvalue != 0:
                if functionhandler.CheckPass(pcserial, pcpass) == 0:
                    sockobj.close()
                    return 0

                elif functionhandler.CheckPass(pcserial, pcpass) == 1:
                    ohandler.WriteO(pcname +' logged on from client address
'+ sockobj.getsockname())
                    return returnvalue

            elif returnvalue == 0:
                if functionhandler.CheckPass(pcserial, pcpass) == 0:
                    sockobj.close()
                    return 0

                elif functionhandler.CheckPass(pcserial, pcpass) == 1:
                    ohandler.WriteO(pcname +' logged on from client address
'+ sockobj.getsockname())
                    return [pcserial, pcname, pcpass, 554, 576, 0, 0]

        else:
            return 0

class FunctionHandler:
    def CheckPass(self, pcserial, pcpass):
        pcinfohandler = PCInfoHandler()
        returnvalue = pcinfohandler.GetInfo(pcserial)
        threadhandler = ThreadHandler()
        if returnvalue != 0:
            for pcinfo in returnvalue:
                for op in self.ListOnlinePlayers():
                    if op.pcpass != pcpass or pcinfo[2] != pcpass:
                        return 0

                    elif pcinfo[2] == pcpass:
                        return 1

        elif returnvalue == 0 and threadhandler.GetThreadObj(pcserial) != 0:
            return 0

        elif returnvalue == 0 and threadhandler.GetThreadObj(pcserial) == 0:
            return 1

    def ListOnlinePlayers(self):
        oplist = []
        for threadobj in threading.enumerate():
            if threadobj.getName() != 'server':
                oplist.append(threadobj)

        return oplist

class PCInfoHandler:
    def CheckFile(self):
        pdisfile = os.path.isfile(os.getcwd() + '\\data\\pc.dat')
        if pdisfile == 0:
            writepd = open(os.getcwd() + '\\data\\pc.dat', 'w')
            writepd.write('[]')
            writepd.close()

    def GetInfo(self, pcserial):
        readpd = open(os.getcwd() + '\\data\\pc.dat', 'r')
        pcinfolist = readpd.readline()
        readpd.close()
        try:
            pcinfolist = eval(pcinfolist)
            for pcinfo in pcinfolist:
                if pcinfo[0] != pcserial:
                    return 0

                elif pcinfo[0] == pcserial:
                    return pcinfo

        except:
            ohandler = OHandler()
            ohandler.WriteO('Couldn\'t read pc.dat')

    def SetInfoSingle(self, pcserial, pcname, pcpass, pcx, pcy, pcz, pcdir):
        readpd = open(os.getcwd() + '\\data\\pc.dat', 'r')
        pcinfolist = readpd.readline()
        readpd.close()
        try:
            pcinfolist = eval(pcinfolist)
            for pcinfo in pcinfolist:
                if pcinfo[0] != pcserial:
                    pcinfolist.append[[pcserial, pcname, pcpass, pcx, pcy,
pcz, pcdir]]

                elif pcinfo[0] == pcserial:
                    pcinfolist.remove(pcinfo)
                    pcinfolist.append[[pcserial, pcname, pcpass, pcx, pcy,
pcz, pcdir]]

        except:
            ohandler = OHandler()
            ohandler.WriteO('Couldn\'t read pc.dat')

        writepd = open(os.getcwd() + '\\data\\pc.dat', 'w')
        writepd.write(str(pcinfolist))
        writepd.close()

    def SetInfoAll(self):
        readpd = open(os.getcwd() + '\\data\\pc.dat', 'r')
        pcinfolist = readpd.readline()
        readpd.close()
        try:
            pcinfolist = eval(pcinfolist)
            for pcinfo in pcinfolist:
                functionhandler = FunctionHandler()
                for op in functionhandler.ListOnlinePlayers():
                    if op.getName() == pcinfo[0]:
                        pcinfolist.remove(pcinfo)
                        pcinfolist.append[[op.getName(), op.pcname,
op.pcpass, op.pcx, op.pcy, op.pcz, op.pcdir]]

        except:
            ohandler = OHandler()
            ohandler.WriteO('Couldn\'t read pc.dat')

        writepd = open(os.getcwd() + '\\data\\pc.dat', 'w')
        writepd.write(str(pcinfolist))
        writepd.close()

class ThreadHandler:
    def GetThreadObj(self, threadname):
        for threadobj in threading.enumerate():
            if threadobj.getName() == threadname:
                return threadobj

            else:
                ohandler = OHandler()
                ohandler.WriteO('Couldn\'t find thread with name \''+
threadname +'\'!')
                return 0

class IHandler:
    def ReadI(self):
        ihandlerstate = 1
        ohandler = OHandler()
        while ihandlerstate == 1:
            input = raw_input()
            if input == 'c':
                ohandler.WriteO('Input: '+ input)
                ohandler.WriteO('Valid commands:')
                ohandler.WriteO('c -- show this list')
                ohandler.WriteO('s -- shut down')

            elif input == 's':
                ohandler.WriteO('Input: '+ input)
                ohandler.WriteO('Shutting down...')
                ihandlerstate = 0
                threadhandler = ThreadHandler()
                serverthread = threadhandler.GetThreadObj('serverthread')
                serverthread.ShutDown()
                ohandler.WriteO('...finished!')

program = Program()
program.Start()



Thanks in advance,

Max





More information about the Python-list mailing list