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()
運行截圖: