#-*- coding: UTF-8 -*-

from asyncore import dispatcher

from asynchat import async_chat

import asyncore, socket

PORT = 5005

NAME = 'TestChat'

class EndSession(Exception):pass

class CommandHandler:

"""

类似于标准库中cmd.Cmd的简单命令处理程序

"""

def unknown(self, session, cmd):

"""响应未知命令"""

session.push('Unknown command: %s\r\n' % cmd)

def handle(self, session, line):

"""处理从给定的会话中接收到的行"""

if not line.strip(): return

#分离命令:

parts = line.split(' ', 1)

cmd = parts[0]

try: line = parts[1].strip()

except IndexError: line = ''

#试着查找处理程序

meth = getattr(self, 'do_'+cmd, None)

try:

#假定它是可以调用的:

meth(session, line)

except TypeError:

#如果不可以呗调用,此段代码响应位置的命令:

self.unknown(session, cmd)

class Room(CommandHandler):

"""

包括一个或多个用户(会话)的泛型环境。它负责基本的命令处理和广播

"""

def __init__(self, server):

self.server = server

self.sessions=[]

def add(self, session):

#一个会话(用户)已经进入房间

self.sessions.append(session)

def remove(self, session):

#一个会话(用户)已经离开房间

self.sessions.remove(session)

def broadcast(self, line):

#向房间中的所有会话发送一行

for session in self.sessions:

session.push(line)

def do_logout(self, session, line):

'响应logout命令'

raise EndSession

class LoginRoom(Room):

"""

为刚刚连接上的用户准备房间

"""

def add(self, session):

Room.add(self, session)

#当用户进入时, 问候

self.broadcast('Welcome to %s\r\n' % self.server.name)

def unknow(self, session, cmd):

#所有未知命令(除了login或者logout外的一切)

#会导致一个告警

session.push('Please log in \nUse "login"\r\n')

def do_login(self, session, line):

name = line.strip()

#确保用户输入了名字

if not name:

session.push('Pleas enter a name\r\n')

#确保用户名字没有被使用

elif name in self.server.users:

session.push('The name "%s" is taken.\r\n' % name)

session.push('Pleas try again.\r\n')

else:

#名字没问题,所以存储在会话中,并且

#将用户移动到主聊天室

session.name = name

session.enter(self.server.main_room)

class ChatRoom(Room):

"""

为多用户相互聊天准备的房间

"""

def add(self, session):

#告诉所有人有新用户进入:

self.broadcast(session.name + 'has entered the room\r\n')

self.server.users[session.name] = session

Room.add(self, session)

def remove(self, session):

Room.remove(self, session)

#告诉所有人有用户离开:

self.broadcast(session.name + 'has left the room\r\n')

def do_say(self, session, line):

self.broadcast(session.name + ':' + line + '\r\n')

def do_look(self, session, line):

#处理look命令,该命令用于查看谁在房间内

session.push('The following are in this room: \r\n')

for other in self.sessions:

session.push(other.name + '\r\n')

def do_who(self, session, line):

#处理who命令,该命令用于查看谁登陆了

session.push('The following are logged in: \r\n')

for name in self.server.users:

session.push(name + '\r\n')

class LogoutRoom(Room):

"""

为单用户准备的简单房间。只用于将用户名从服务器移除

"""

def add(self, session):

#当会话(用户)进入要删除的LogoutRoom时

try: del self.server.users[session.name]

except KeyError: pass

class ChatSession(async_chat):

"""

单会话,负责和单用户通信

"""

def __init__(self, server, sock):

#标准设置任务

async_chat.__init__(self, sock)

self.server = server

self.set_terminator('\r\n')

self.data = []

self.name = None

#所有的会话都开始于单独的LoginRoom中:

self.enter(LoginRoom(server))

def enter(self, room):

#从当前房间中移除自身(self),并且将自身添加到下一个房间...

try: cur = self.room

except AttributeError: pass

else: cur.remove(self)

self.room = room

room.add(self)

def collect_incoming_data(self, data):

self.data.append(data)

def found_terminator(self):

"""

如果发现一个终止对象,也就意味着读入了一个完整的行,将其广播给每个人

"""

line = ''.join(self.data)

self.data = []

try: self.room.handle(self, line)

except EndSession:

self.handle_close()

def handle_close(self):

async_chat.handle_close(self)

self.enter(LogoutRoom(self.server))

class ChatServer(dispatcher):

"""

只有一个房间的聊天服务器

"""

def __init__(self, port, name):

# Standard setup tasks

dispatcher.__init__(self)

self.create_socket(socket.AF_INET, socket.SOCK_STREAM)

self.set_reuse_addr()

self.bind(('',port))

self.listen(5)

self.name = name

self.users={}

self.main_room = ChatRoom(self)

def handle_accept(self):

conn, addr = self.accept()

#print 'Connection attempt from', addr[0]

#self.sessions.append(ChatSession(self, conn))

ChatSession(self, conn)

if __name__=="__main__":

s = ChatServer(PORT, NAME)

try: asyncore.loop()

except KeyboardInterrupt: print

python异步socket接收_Python简易聊天工具-基于异步Socket通信相关推荐

  1. python余弦相似度_Python 简易聊天机器人(附带基础余弦相似度实现)

    # 开发者: "Wang" # 开发时间:2019/8/2913:07 # 文件名称:chatbot.py # 开发工具:PyCharm # 各种库 from flask impo ...

  2. java socket 工具_java Socket简易聊天工具

    本文实例为大家分享了一款Socket简易聊天工具,希望大家喜欢. 代码运行如图,看起来还不错 服务端 package qiu; import java.awt.BorderLayout; import ...

  3. 基于Socket的简易聊天工具

    文章目录 基于Socket的简易聊天工具 简易聊天工具的功能: 项目设计 1.界面设计 2.类的设计 程序编写 1.ChatServer 2.ChatFrame 窗体的设计 1.ChatFrame的窗 ...

  4. Socket编程实现简易聊天室

    1.Socket基础知识 Socket(套接字)用于描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发出请求或者应答网络请求. Socket是支持TCP/IP协议的网络通信的基本 ...

  5. RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增企业通(内部简易聊天工具)...

    RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本 新增企业通(内部简易聊天工具) RDIFramework.NET,基于.NET的快速信息化系统开发.整合框架,给用 ...

  6. Express+Socket.IO 实现简易聊天室

    代码地址如下: http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: ...

  7. python 在线编程 实现_Python进阶开发之网络编程,socket实现在线聊天机器人

    系列文章 本文目录 .什么是socket? 说到网络编程,难免要提到socket? 那什么是socket呢,中文名叫"套接字",更难理解了吧. 通俗来讲,socket表示一个网络连 ...

  8. java socket 工具_java+socket 简易聊天工具

    1.服务器端程序 package com.test3; import java.io.*; import java.net.*; import java.awt.*; import java.awt. ...

  9. java socket聊天工具_java+socket 简易聊天工具

    1.服务器端程序 package com.test3; import java.io.*; import java.net.*; import java.awt.*; import java.awt. ...

最新文章

  1. Python标准模块--asyncio
  2. linux c 错误 'for' loop initial declaration used outside C99 mode
  3. C语言用char数组存储一串整数时的一个陷阱
  4. 机器学习第11天:朴素贝叶斯模型 - 垃圾短信识别
  5. 超过一天的文件_一键合并多个excel文件至同一工作表!
  6. 2016重庆计算机一级考试题型,重庆计算机一级考试真题2016年最新(笔试+上机).doc...
  7. JAVA入门级教学之(静态内部类)
  8. 基于Java+SpringBoot+vue+element实现前后端分离牙科诊所管理系统详细设计
  9. Oracle 拼音码函数
  10. logstash filter 处理json数据按原始数据字段数据存储
  11. 作为电磁波的 Wi-Fi 信号
  12. [HTML5和Flash视频播放器]Video.js 学习笔记(一 ) HLS库:videojs-contrib-hls
  13. 修改远程服务器的端口号
  14. vue用阿里云oss上传图片使用分片上传只能上传100kb以内的解决办法 1
  15. html 如何清除历史记录,如何删除网页历史记录?
  16. 【二进制】鑫鑫的算术
  17. 线上问题:nginx日志打印时间问题
  18. qt实现涂鸦板_Qt之旅--- 10 涂鸦板
  19. 相邻染色问题java_浅析一类要求相邻不同的环上染色问题
  20. 大数据教学整套视频及源码

热门文章

  1. 论文解读《Semi-Supervised Semantic Segmentation with Cross Pseudo Supervision》
  2. 【香港科技大学(广州)】博士后/博士/硕士/研究助理招聘
  3. 用计算机唱出山,抖音出山原唱是谁 抖音出山歌词完整版
  4. 美国计算机硕士预科学校,美国硕士预科申请
  5. php7.>=3 环境重新安装libzip
  6. 八年级计算机教案下册,八年级信息技术下册教案
  7. 2020web前端学习路线(附全套前端视频教程+教学大纲)
  8. C# windows media player 双窗口同步播放视频
  9. WCDMA终端网络搜索过程剖析
  10. Tizen系统截图曝光 三星I9500或将率先采用