python 多人聊天DOS版
DOS版,支持登陸,注銷,命令行等操作,寫的比較簡單,僅供參考學習。
參考資料https://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html
參考資料https://www.oschina.net/code/snippet_1387924_25928
客戶端:
#coding=GBK ''' Created on 2014/3/18 @author: LING ''' import socket import threading import random import time import os class QFclient(object): def __init__(self,my_socket): self.name='' self.socket=my_socket self.sendstr='' self.recvstr='' self.isLogon=False def send(self,s): while True: try: self.sendstr=raw_input() self.sendstr=self.sendstr.strip(' ') if 'command ' == self.sendstr[:8]: if self.sendstr[8:]=='dir' or self.sendstr[8:]=='ls': os.system('dir') else: os.system(self.sendstr[8:]) elif 'login ' ==self.sendstr[:6]: self.name=self.sendstr[6:].strip(' ').split(' ')[0] s.send(self.sendstr) elif '--help' == self.sendstr[:6]: print '======================================' print 'login -user -password //登陸係統' print 'command -expr //執行DOS命令' print '-version //查看當前版本' print 'request -user -ls //查看用戶組狀態' print 'request -file -ls //查看群共享(需要登陸)' print 'request -download -filename //下載文件,filename為文件名(需要登陸)' print 'request -upload -filepath //上傳件,filepath為文件路徑(需要登陸)' print 'request -logoff //退出係統' print '======================================' elif '-version'==self.sendstr[:8]: print '*** 這是一個複雜的多人聊天室程序 ***' print '***@author: ling @version: v1.0.0***' elif self.isLogon==True: self.sendstr=self.name+':'+self.sendstr s.send(self.sendstr) except Exception,e: break def recv(self,s): while True: try: self.recvstr=s.recv(1024) if not self.recvstr: break if self.recvstr !=self.sendstr: if self.isLogon==False: if self.recvstr=='response:ok': os.system('cls') print '***登陸成功,現在你可以聊天啦***' self.isLogon=True elif self.recvstr=='response:logoff ok': self.isLogon=False print '成功退出' else: print self.recvstr else: print self.recvstr except Exception,e: break def start(self): os.system('color 0a') sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) try: sock.connect(self.socket) print '***歡迎使用DOS QF客戶端,請先登陸或者注冊賬號,幫助請輸入--help***' except Exception,e: print 'QF服務器已跪,3秒後自動退出' time.sleep(3) return sock.send(self.socket[0]) thrdin=threading.Thread(target=self.recv,args=(sock,)).start() thrdout=threading.Thread(target=self.send,args=(sock,)).start() if __name__=='__main__': mysock=('127.0.0.1',8888) aclient=QFclient(mysock) aclient.start()
服務端:
#coding=GBK ''' Created on 2014/3/18 @author: LING ''' import socket import sys import threading import os import time class QFserver(object): def __init__(self,my_socket): self.con=threading.Condition()#條件變量 self.socket=my_socket self.data='' self.onlineUser=0 self.connectUser=0 self.users={'li':{'state':0,'pass':'123456'}, 'zhang':{'state':0,'pass':'123456'}, 'ding':{'state':0,'pass':'123456'}} def start(self): os.system('color 0a') s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) print 'QF服務器成功開啟!' s.bind(self.socket) s.listen(30) print 'QF服務器正在監聽客戶端連接...' while True: conn,addr=s.accept() print addr[0]+':'+str(addr[1])+'連接' name=conn.recv(1024) print self.data conn.send(self.data) isLogon=False self.connectUser+=1 threading.Thread(target=self.ClientIn,args=(conn,name,isLogon)).start() s.close() def ClientIn(self,conn,name,isLogon): while True: try: temp=conn.recv(1024).strip(' ')#等待客戶端發送信息 if not temp: conn.close() return if isLogon==False: if temp[:6]=='login ': user=temp[6:].strip(' ').split(' ') print user[0]+':'+user[1] print self.users[user[0]].get('pass') if user[0] in self.users and user[1]==self.users[user[0]].get('pass') and 0==self.users[user[0]].get('state'): if self.users[user[0]].get('state')==0: self.users[user[0]]['state']=1 conn.send('response:ok') isLogon=True self.onlineUser+=1 name=temp[6:].split(' ')[0] print name+'成功登錄!' print self.UserState() threading.Thread(target=self.ClientOut,args=(conn,name)).start() elif self.users[user[0]].get('state')==1: conn.send('您的賬號已在別處登錄!') else: conn.send('賬號密碼錯誤') else: conn.send('請先登陸...') elif isLogon==True: cmd=temp.split(':') if cmd[1][:8]=='request ': if cmd[1][8:]=='user ls': conn.send('response:'+self.UserState()) elif cmd[1][8:]=='logoff': conn.send('response:logoff ok') self.onlineUser-=1 isLogon=False elif cmd[1][8:]: conn.send('您的版本過低,請升級客戶端...') else: self.NotifyAll('>>>'+temp)#收到信息後激活所有輸出線程 print self.data except Exception,e: if isLogon == True: self.NotifyAll(name+'離開了') isLogon==False self.onlineUser-=1 self.connectUser-=1 self.users[user[0]]['state']=0 print self.data return def ClientOut(self,conn,name): while True: if self.con.acquire():#獲得鎖定 self.con.wait()#使線程進入condition等待池,並釋放鎖,等待通知 if self.data:#如果被激活並且收到服務端數據開始群發 try: conn.send(self.data) except Exception,e: return finally: self.con.release()#釋放鎖 def NotifyAll(self,str): if self.con.acquire():#加鎖 self.data=str self.con.notifyAll()#激活,將等待池中所有線程置入等待池,嚐試獲得鎖定 self.con.release()#釋放鎖 def UserState(self): s= '當前'+str(self.connectUser) + '人建立連接,'+\ str(self.onlineUser)+'人在線' return s if __name__=='__main__': mysock=('127.0.0.1',8888) aserver=QFserver(mysock) aserver.start()
運行截圖:
最後更新:2017-04-03 12:55:42