simple chat server in python
Bosan!
Lagi pengen cari hiburan. Akhirnya ngoprek python yang mrogramnya headache-free. Biar seru pygame dipilih sebagai mainan. Hasil akhirnya game pesawat-pesawatan SHMUP-defense yang dipublish di sini yang dibuat dalam waktu 1 hari (gambarnya udah dibikin di project lain yang platformnya j2me).
Biar belajar sesuatu yang baru tapi masih berkaitan sama tugas kuliah (distributed shared memory bwt wireless embedded network sama simulasi berbasis agen) akhirnya diputuskan pengen bikin MMO yang as-simple-as-possible pake python. Lagi penasaran aja pake socket di python. ternyata cukup sederhana, mungkin bisa dibilang lebih sederhana dari socket di JAVA. habis baca tutorialnya langsung bikin echo server, dengan tambahan. di client, untuk nerima message dari client yang lain nggak harus nunggu input seperti yang ada di sini.
"""
file : server.py
auth : Pebbie
desc : echo server, multithreaded
"""
import socket, threading
import os, sys
BACKLOG = 5
class Server:
def __init__(self,host='',port=8080,size=1024):
self.host = host
self.port = port
self.size = size
self.socket = None
self.threads = []
self.run()
def open(self):
try:
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.bind((self.host,self.port))
self.socket.listen(BACKLOG)
except socket.error(value, message):
if self.socket:
self.socket.close()
print "create socket failed : ", message
sys.exit(1)
def run(self):
self.open()
running = True
while running:
c = Client(self, self.socket.accept())
self.threads.append(c)
c.start()
self.close()
def close(self):
self.socket.close()
for c in self.threads:
c.join()
def send(self,msg):
for c in self.threads:
c.client.send(msg)
class Client(threading.Thread):
def __init__(self,owner,(client,address)):
threading.Thread.__init__(self)
self.owner = owner
self.client = client
self.address = address
self.size = 1024
self.running = False
def close(self):
try:
self.owner.threads.remove(self)
self.owner.send("quit")
self.client.close()
except:
pass
self.running = False
print "closing ", self.address
def run(self):
self.running = True
while self.running:
try:
data = self.client.recv(self.size)
if data:
print "received from ", self.address, data
self.interpret(data)
else:
self.close()
except:
self.close()
def interpret(self,msg):
if msg == "stop":
self.client.send(msg)
self.close()
else:
self.owner.send(msg)
if __name__=='__main__':
s = Server()
Tadinya di contoh kode Python network programming ada kode yang pakai modul select, tapi entah kenapa selalu aja exception ketika objek yang dimasukinnya sys.stdin. mungkin ada yang pernah pengalaman bisa bantu?
berikutnya kode untuk client
""" file : client.py auth : pebbie desc : echo client, bisa ngirim untuk client lain """ from socket import * import threading import os,sys DATASIZE = 1024 class SocketListener(threading.Thread): def __init__(self,owner): threading.Thread.__init__(self) self.owner = owner self.socket = owner.socket self.running = False def run(self): print "listener started" self.running = True while self.running: data = self.socket.recv(self.owner.size) print '\nreceived:', data if data == "stop": self.running = False self.socket.close() print "disconnected, press return" class Client: def __init__(self,host='localhost',port=8080,size = DATASIZE): self.host = host self.port = port self.size = size self.socket = None self.listener = None self.open() def open(self): try: self.socket = socket(AF_INET, SOCK_STREAM) self.socket.connect((self.host,self.port)) except : self.socket = None print "something happened, connect failed", msg sys.exit(1) self.listener = SocketListener(self) self.listener.start() def run(self): while self.listener.running: cmd = raw_input() if not self.listener.running: break self.socket.send(cmd) self.listener.join() if __name__=='__main__': Client().run()
di client, kode untuk socket.recv dipisah di thread tersendiri. jadi kalau client lain ngirim pesan, pesannya bisa diterima tanpa harus ngetik sesuatu (kekurangan yang ada di contoh pymmo). selanjutnya tinggal penanganan data world & entity, sama game client. rencananya sih untuk manajemen data pake sqlite3 aja yang udah built-in di python 2.5. cara pakai sqlite pun lumayan mudah, tapi dibahasnya nanti aja kalo kode untuk usernya udah jadi.
Filed under: akademik, distributed system, gamedev, hacking, programming | 4 Comments
Tags: mmog, pygame, pymmo, python, socket, threading

tugas OSL kita cemana…..
sori baru inget
wew great.. belajar java bagus sebagai permulaan untuk SAP..
mas-mas map nieh gue bego banget,,
cara posting kode kaya di atas gimana,,,kan rapih tuh,, gw mau nulis kode hml/javascript tapi gak muncul semua
http://support.wordpress.com/code/