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()
        

运行截图:

时间: 2024-09-12 16:59:17

python 多人聊天DOS版的相关文章

socket多人聊天程序C语言版(二)_C 语言

socket多人聊天程序C语言版(一)地址: http://www.jb51.net/article/94938.htm 1V1实现了,1V多也就容易了.不过相对于1V1的程序,我经过大改,采用链表来动态管理.这样效率真的提升不少,至少CPU使用率稳稳的在20以下,不会飙到100了.用C语言写这个还是挺费时间的,因为什么功能函数都要自己写,不像C++有STL库可以用,MFC写就更简单了,接下来我还会更新MFC版本的多人聊天程序.好了,废话少说,进入主题. 这个程序要解决的问题如下: 1.CPU使

socket多人聊天程序C语言版(一)_C 语言

首先,不要一步登天直接解决多人聊天这个问题,先把问题化简. 1.多人聊天的核心问题是服务器如何标识不同的客户端,如何根据客户端的需求转发消息给指定客户端. 2.多人聊天转化为C-C聊天,但是不再是直接C-C,而是通过server转发消息,所以变成==>C-S-C. 3.server如何允许2个client同时连接,设置listen函数的第二个参数,最大连接数. 4.server如何标识两个client,用一个结构体数组来存放两个client的信息. 5.server如何转发消息给client,很

Python Socket 编程——聊天室示例程序

原文:Python Socket 编程--聊天室示例程序 上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所有人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.如下图: 图来自:http://www.ibm.com/de

《Python核心编程(第二版)》——1.5 运行Python

1.5 运行Python 有三种不同的办法来启动Python.最简单的方式就是交互式的启动解释器,每次输入一行Python代码来执行.另外一种启动Python的方法是运行Python脚本.这样会调用相关的脚本解释器.最后一种办法就是用集成开发环境中的图形用户界面运行Python.集成开发环境通常整合了其他的工具,例如集成的调试器.文本编辑器,而且支持各种像CVS这样的源代码版本控制工具. 1.5.1 命令行上的交互式解释器 在命令行上启动解释器,你马上就可以开始编写Python代码.在Unix,

xmpp-基于XMPP spark客户端 多人聊天室,消息记录问题?

问题描述 基于XMPP spark客户端 多人聊天室,消息记录问题? 1.spark客户端加入某个聊天室,都会获取该聊天室之前所有的记录.因为我对openfire不太了解,没看过源码.想问一下,返回的聊天记录是不是有一定条数限制?2.还有对于这个浪费流量,很不合理的问题,有么有在原有机制上的改过的方式(或者说是改openfire源码)?

新网络人远程控制旗舰版教程

会员注册请点此:http://home.netman123.cn/getvip.asp 网络人旗舰版不仅拥有网络人个人办公版和监控版全部功能,同时还享有:一对多.多对多控制,一个或多个控制端同时控制多个被控端电脑,同时查看多个电脑屏幕,批量分发文件.批量关机,语音视频控制.屏幕定时录像.发送文字广播,开启摄像头,无需逐一输入IP/ID和控制密码被控电脑即自动上线,--它使用世界上速度最快的VNC核心,远程遥控鼠标键盘以及上传下载文件的速度超快.它是正规合法的软件,不会被杀毒软件当作病毒查杀. 下

新浪UC如何邀请好友加入多人聊天

在好友列表中点击好友呢称左右键或者是好友滑动条下空白处右键,在弹出的菜单中选择"多人聊天",或者在聊天窗口右边的选择"邀请好友加入"项.新浪UC将出现选择好友面板,您的在线好友将以您自定义的组别列出,您可以选择并邀请他们以多人聚会的方式,一起参与文本聊天或语音聊天.

人人桌面如何跟好友进行多人聊天?

在好友栏中,按下Ctrl键,选中想要聊天的好友,右键单击后,在弹出的菜单中选择"邀请多人聊天". 您还可以建立整个好友组群聊:直接右键点击一个好友组的名字,在弹出的窗口中选择"发起多人聊天"即可.

人人桌面是什么如何多人聊天

  什么是人人桌面? 人人桌面(原校内通)是一款面对人人网用户的官方增强软件,可使用人人网帐号直接登录.软件具备新鲜事提醒.快速回复留言.即时聊天.快速登录应用.定时启动游戏等诸多功能,方便用户更好的与好友沟通交流. 如何用人人桌面快速回复留言? 当您在人人网上收到新鲜事时,人人桌面会弹出提醒框,您可以点击提醒框即可进入人人桌面的聊天界面. ps:如果您是人人桌面与网页同时在线,那么您网页右下角"好友列表"旁边会自动展开聊天窗口. 如何屏蔽新鲜事提醒? 方法一:在新鲜事提醒框中直接点击