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