#-----------------------------------------------------# # gatoserv-vr-0-1.py # # This is the tic-tac-toe game server V.r. 0.1. # # Juan Francisco Benavides Nanni- Dracko - 17/01/2006 # # Blog: http://mmabj.tk # # mail: elnanni@gmail.com # #-----------------------------------------------------# from socket import * import select import threading import sys import random import time class user(object): """This is a user object.""" _WEL = """ Welcome to the Tic-Tac-toe game server, we hope that you have a great time here, the principal goal of this server is to play with the I.A., but there's no problem if you play it, anyway, please if you can register in our Data Base. By the way, the nick name can't be longer than 10 chars, and can't have spaces, any way, if you don't respect this rules the script takes care of this, you'll se. \n""" _OPT = """ This are the options. 1.- Register in our DataBase. 2.- Let's Play. 3.- Who's online. 4.- Exit the menu. To exit just close this window. """ _TOT = 1024 usrs = [] def __init__(self, usr_sock): """This is the constructor of the user object.""" self.usr_sock = usr_sock usrs = [] self._welcome() def _welcome(self): self.host, self.port = self.usr_sock.getpeername() self.usr_sock.send(user._WEL) self.usr_sock.send("Nick Name:") try: self.flag = False self.name = self.usr_sock.recv(user._TOT) for self.i in range(len(user.usrs)): if self.name in user.usrs[self.i]: self.flag = True break while self.flag: self.flag = False self.usr_sock.send("\n%s is already online, please chose a new nick.\nNick:" % (self.name, )) self.name = self.usr_sock.recv(user._TOT) for self.i in range(len(user.usrs)): if self.name in user.usrs[self.i]: self.flag = True break if self.name.isspace() or " " in self.name or len(self.name) > 10: self.name = "Guest%s%s" % (random.randrange(999), random.randrange(99)) user.usrs.append((self.host, self.port, self.name, self.usr_sock)) self._opti() except: pass def _opti(self): """This are the options.""" self.usr_opt = None while self.usr_opt not in ("4", ): try: self.usr_sock.send(user._OPT) self.usr_opt = self.usr_sock.recv(user._TOT) if self.usr_opt in ("1", ): print "%s uno" % (str(self.usr_opt)) elif self.usr_opt in ("2", ): print "%s dos" % (str(self.usr_opt)) elif self.usr_opt in ("3", ): self._whli() elif self.usr_opt in ("4", ): self.usr_sock.send("\n\nYou've been disconected.\n") else: self.usr_sock.send("\n\nPlease chose a valid option.\n") except: break def _whli(self): """Shows online users.""" self.tot_usr = 1 self.env_usr = """ Table of online Users. """ self.env_usr += "\n\n" for self.show_usr in user.usrs: if self.tot_usr % 4 != 0: self.env_usr += "%s\t" % (self.show_usr[2], ) else: self.env_usr += "%s\n" % (self.show_usr[2], ) self.tot_usr += 1 self.env_usr += "\n\n" self.usr_sock.send(self.env_usr) class server_object(object): """This is the server_object fot the tic-tac-toe game, default host is '', and default port is 8000""" def __init__(self, host = '', port = 8000): """This is the constructor of server_object.""" self.server = socket(AF_INET, SOCK_STREAM) self.server.bind((host, port)) self.server.listen(2) server_object.desc = [self.server] print "The server started on port %d" % (port, ) def run(self): """It's gonna make this run.""" while 1: self.accept_new_connection() (self.sread, self.swrite, self.sexc) = select.select(self.desc, [], []) for self.sock in self.sread: if self.sock != self.server: self._stil_con(self.sock) def accept_new_connection(self): """Accepts new conections""" newsock, (remhost, remport) = self.server.accept() server_object.desc.append(newsock) print "Client joined %s:%s\n" % (remhost, remport) print "%s" % (time.ctime(), ) self.thread = threading.Thread(target = user, args = (newsock, )) self.thread.start() def broadcast_string(self, stri, omit_sock): """Makes a broadcast.""" for sock in server_object.desc: if sock != self.server and sock != omit_sock: sock.send(stri) print stri def _stil_con(self, sock): """Seeks dead sockets.""" self.host, self.port = self.sock.getpeername() try: sock.recv(1024) sock.settimeout(.1) except error: print "Client %s:%s left.\n" % (str(self.host), str(self.port)) server_object.desc.remove(sock) sock.close() try: for self.i in user.usrs: if self.i[0] == self.host and self.i[1] == self.port and self.i[3] == sock: self.name = self.i[2] break user.usrs.remove((self.host, self.port, self.name, sock)) except: pass if __name__ == "__main__": server = server_object().run()