基于Twisted的简单聊天室

实现了私聊,公聊。用户名密码存在redis。为了拓展,做了简单的模块。

#coding=utf8
from twisted.internet import reactor, defer
from twisted.protocols.basic import LineReceiver
from twisted.internet.protocol import Factory, Protocol, ServerFactory
import redis

class Server(ServerFactory):
        def __init__(self):
            self.users = {}
            self.last_messages = {}
            self.__db = dbServer
        #def start(self):

        #def stop(self):

        def do_login(self, pro, args):
            username, passwd = args
            if self.__db.get(username) is not None:
                if passwd != self.__db.get(username):
                    return "do_login", False, "login failed"
                else:
                    user = User(username, passwd, pro, 1)
                    self.users[username] = user
                    pro.user = user
                    return "do_login", True, "login success"
            else:
               self.__db.set(username, passwd)
               self.__db.save()
            user = User(username, passwd, pro, 1)
            self.users[username] = user
            pro.user = user
            return "do_login", True, "login success"

        def checklogin(self, user):
            return user.logined

        def do_privatemsg(self, pro, args):
            target, msg = args
            user = pro.user
            if self.checklogin(user):
                self.last_messages[user] = msg
                msg = ‘[‘+user.name+‘]‘ + msg
                return "do_privatemsg", self.users[target], msg

        def do_publicmsg(self, pro, args):
            msg = args
            user = pro.user
            print user.name
            if self.checklogin(user):
                self.last_messages[user] = msg
                msg = ‘[‘+user.name+‘]‘ + msg[0]
                return "do_publicmsg", self.users.values(), msg

class User(object):
        def __init__(self, name, passwd, pro, logined):
                self.name = name
                self.password = passwd
                self.nick_name = ‘&&‘ + name + ‘&&‘
                self.proto = pro
                self.logined = logined

class ChatProtocol(LineReceiver):
        #line format: "func target_name *contents"
        #example: "privatemsg hs how are you....."
        #example: "publicmsg how are you....."
        #example: "login hs password"
        def __init__(self):
            self.user = 0
            self.pro = self

        def connectionMade(self):
            self.sendLine("please input: ‘login,username,password‘")

        def lineReceived(self, line):
            defer.maybeDeferred(self.parse, line).addCallback(self.processor).addCallback(self.ack)

        def parse(self, line):
            result = line.split(‘,‘)
            func = result[0]
            args = result[1:]
            return func, args

        def processor(self, args):
            func, arg = args
            _func = getattr(server, ‘do_‘ + func)
            if _func:
                return _func(self.pro, arg)
            else:
                raise Exception("xxxxx")

        def ack(self, args):
            func, target, msg = args
            if func == ‘do_login‘:
                if not target:
                   self.kickOut()
                self.sendLine(msg)
            elif func == ‘do_privatemsg‘:
                target.proto.sendLine(msg)
            elif func == ‘do_publicmsg‘:
                for user in target:
                    if user.proto != self:
                        user.proto.sendLine(msg)
            else:
                pass

        def kickOut(self):
            self.sendLine(‘passwd is wrong‘)
            self.transport.loseConnection()

class redisServer(object):
        def __init__(self):
            r = redis.Redis(host=‘localhost‘, port=6379, db=0)
            self.db = r
        def set(self, key, value):
            self.db.set(key, value)
        def save(self):
            self.db.save()
        def get(self, key):
            return self.db.get(key)

dbServer = redisServer()
server = Server()
server.protocol = ChatProtocol
reactor.listenTCP(8008,server)
print ‘server start!‘
reactor.run()

  

时间: 2024-08-08 16:31:25

基于Twisted的简单聊天室的相关文章

Flask基于websocket的简单聊天室

1.安装gevent-websocket pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gevent-websocket 2.chat.py文件内容如下: from flask import Flask,request,render_template import json from geventwebsocket.handler import WebSocketHandler from gevent.pywsgi import

基于GUI的简单聊天室01

运用了Socket编程,gui,流的读入和写出,线程控制等 思路: 1.首先是在客户端中先建立好聊天的GUI 2.建立服务器端,设置好端口号(用SocketServer),其中需要两个boolean变量来分别表示服务器是否已经开启和是否有客户端连接进来, 利用while循环来让服务器在开启的情况下不断接收客户端的信息.利用DataOutputStream来进行通讯 3.客户端连接服务器(Socket) 首先是客户端的类 1 import java.awt.BorderLayout; 2 impo

基于GUI的简单聊天室02

服务器端 与上一篇相比,加进了线程内部类,解决多个客户端连接时,服务器无法全部响应的问题. 利用List集合来装载客户端的对象. 还需要注意全局变量的应用. 1 /** 2 * 相比01,加进了线程内部类,解决多个客户端连接时,服务器无法全部响应的问题. 3 * @author Administrator 4 * 5 */ 6 7 import java.io.DataInputStream; 8 import java.io.DataOutputStream; 9 import java.io

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室.

C#实例之简单聊天室(状态管理)

前言        状态管理是在同一页或不同页的多个请求发生时,维护状态和页信息的过程.因为Web应用程序的通信协议使用了无状态的HTTP协议,所以当客户端请求页面时,ASP.NET服务器端都会重新生成一个网页实例.此时,旧网页的任务完成,旧网页的实例也随之消失.这种无状态,意味着客户端用户在浏览器中的一些状态或是对数据的一些修改都将丢失. 为了弥补这种基于web应用程序的固有限制,ASP.NET提供了多种用于管理状态的功能. 简单聊天室 这里运用System.Web命名空间的那些管理状态的类,

基于flask的网页聊天室(二)

基于flask的网页聊天室(二) 前言 接上一次的内容继续完善,今天完成的内容不是很多,只是简单的用户注册登录,内容具体如下 具体内容 这次要加入与数据哭交互的操作,所以首先要建立相关表结构,这里使用flask-sqlalchemy来辅助创建 首先修改之前的init文件为: from flask import Flask from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() from web_chatroom.models impor

Python Socket 简单聊天室2

上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # -*- coding:utf-8 -*- import SocketServer class  mysocketclass(SocketServer.BaseRequestHandler):     def handle(self):         client_inform

ASP.NET 使用application和session对象写的简单聊天室程序

ASP.Net中有两个重要的对象,一个是application对象,一个是session对象. Application:记录应用程序参数的对象,该对象用于共享应用程序级信息. Session:记录浏览器端的变量对象,用来存储跨网页程序程序的变量或者对象. 说实话,写了快一年的asp.net,application对象还真没怎么用过.看了看书,根据这两个对象的特性写了一个简单的聊天室程序.真的是非常的简陋. 我的思路是,有两个页面Default页和ChatRoom页,页面布局如图: Default

基于Socket的Android聊天室

1        基于Socket的Android聊天室 Socket通信是网络通信中最常用的技术之一,通过Socket建立的可靠连接,可以让多个终端与服务器保持通信,最典型的应用是建立一个多人聊天程序.本实例使用ServerSocket建立聊天服务器.将服务器端所有的通讯线程保存到一个集合当中,当有用户发来数据,则转发给所有用户,实现聊天室效果.Android端通过使用Socket建立客户端链接,并且在AsyncTask中执行网络读写的任务,将用户输入的内容发送到服务器,并接收服务器发来的数据