python 多人聊天DOS版

DOS版,支持登陸,註銷,命令行等操作,寫的比較簡單,僅供參考學習。

參考資料http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html

參考資料http://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()
        

運行截圖:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章