python 土拨鼠库_为了应对某人的需求,写了一个简单的聊天室内容
Python聊天室
背景
这是一篇水文,同时也是更换markdown后的第一篇,主要是为了测试markdown的情况。
服务器程序
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
聊天室服务器程序v1.0.1
作者:挖洞的土拨鼠
联系:
GitHub:https://github.com/cisp
Blog:http://www.cnblogs.com/KevinGeorge/
"""
#引入依赖包、库文件
import sys
import time
import socket
import select
import logging
import datetime
#设置全局配置
reload(sys)
sys.setdefaultencoding("utf-8")
logging.basicConfig(filename="./talkroom.log",level=logging.INFO,filemode='a',format='%(asctime)s-%(levelname)s:%(message)s')
#定义全局变量
test_port = 38080
test_addr = "127.0.0.1"
#定义全局函数
def now():
return str(datetime.datetime.now())
#定义聊天室类
class TalkRoom(object):
"""创建聊天室类"""
def __init__(self,ipaddress,port,max):
"""
构造函数:
初始化聊天人字典结构
初始化服务器套接字
初始化轮询队列
"""
self.__register_name_dictionary = {}
self.__server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
self.__server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.__server.bind((ipaddress,port))
self.__server.listen(max)#设置聊天室最大限制人数
self.__readable_socket_list = [self.__server]
self.__writeable_socket_list = []
self.__error_socket_list = [self.__server]
def broadcast(self,sockfd,msg):
for sock in self.__register_name_dictionary:
if sock != sockfd:
try:
sock.send("\n"+msg)
except Exception,reason:
logging.info(reason)
sock.close()
self.broadcast(sock,"[%s %s]已经退出聊天室\n"%(self.__register_name_dictionary[sock][0],now()))
self.__register_name_dictionary.pop(sock)
def running(self):
while True:
rs,ws,es = select.select(self.__readable_socket_list,self.__writeable_socket_list,self.__error_socket_list)
for sockfd in rs:
if sockfd == self.__server:
client,addr = sockfd.accept()
self.__register_name_dictionary[client] = (None,addr)
client.send("请输入您的昵称:")
name = client.recv(1024)
self.__register_name_dictionary[client] = (name,addr)
self.broadcast(client,"[%s %s]刚刚进入聊天室\n"%(name,now()))
self.__readable_socket_list.append(client)
self.__error_socket_list.append(client)
continue
else:
try:
data = sockfd.recv(4096)
if data:
self.broadcast(sockfd,"[%s %s]"%(self.__register_name_dictionary[sockfd][0],now())+data)
except Exception,reason:
logging.info(reason)
sockfd.close()
self.broadcast(sockfd,"[%s %s]已经退出聊天室\n"%(self.__register_name_dictionary[sockfd][0],now()))
self.__register_name_dictionary.pop(sockfd)
self.__readable_socket_list.remove(sockfd)
self.__error_socket_list.remove(sockfd)
if __name__ == "__main__":
room = TalkRoom(test_addr,test_port,5)
room.running()
客户端程序
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
聊天室客户端程序v1.0.1
作者:挖洞的土拨鼠
联系:
GitHub:https://github.com/cisp
Blog:http://www.cnblogs.com/KevinGeorge/
"""
#引入依赖包、库文件
import sys
import time
import select
import socket
import logging
import datetime
#设置全局配置
reload(sys)
sys.setdefaultencoding("utf-8")
logging.basicConfig(filename="./talkclient.log",level=logging.INFO,filemode='a',format='%(asctime)s-%(levelname)s:%(message)s')
#定义全局变量
test_port = 38080
test_addr = "127.0.0.1"
#定义全局函数
def now():
return str(datetime.datetime.now())
def inputflag() :
sys.stdout.write('[MySelf %s]'%now())
sys.stdout.flush()
#定义客户端类
class TalkClient(object):
def __init__(self,ipaddress,port):
self.__client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.__readable_socket_list = [sys.stdin,self.__client]
self.__writeable_socket_list = []
self.__error_socket_list = [self.__client]
try:
self.__client.connect(("127.0.0.1", 38080))
except Exception,reason:
logging.info(reason)
exit(0)
print "[MySelf %s]刚刚进入聊天室"%now()
banner = self.__client.recv(1024)
print banner
name =raw_input()
self.__client.send(name)
inputflag()
def running(self):
while True:
rs,ws,es = select.select(self.__readable_socket_list,self.__writeable_socket_list,self.__error_socket_list)
for sockfd in rs:
if sockfd == self.__client:
data = self.__client.recv(4096)
if data:
sys.stdout.write(data)
inputflag()
else:
exit(0)
else:
message = sys.stdin.readline()
self.__client.send(message)
inputflag()
#主程序入口
if __name__ == "__main__":
client = TalkClient(test_addr,test_port)
client.running()
效果如下图
python 土拨鼠库_为了应对某人的需求,写了一个简单的聊天室内容相关推荐
- python开发一个简单的聊天室
使用python的twisted框架编写一个简单的聊天室 下面是基本架构 基本架构图 -- coding:utf-8 -- from twisted.internet.protocol import ...
- python 土拨鼠库_傻傻分不清楚系列|Python中各种时间处理方法(上)
相信大多数数据分析师在入手Python的时候,在学习到time库与datetime库时,都会对两个库里面长得很像,又相互有关联的各种类和方法感到非常窝心.当接触到pandas处理时间序列的方法时,再次 ...
- python写机器人程序_用Python写的一个多线程机器人聊天程序
本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...
- 通过python 构建一个简单的聊天服务器
构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使 ...
- python聊天室详细教程_python简单实现聊天室功能(代码教程)
聊天室程序需求: 我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所有人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.如下图: 这里我们首先要 ...
- python gis库_使用开放的python库自动化GIS和遥感工作流
python gis库 Over my career I've worked on many geospatial related projects using the ArcGIS platform ...
- python并行运算库_最佳并行绘图Python库简介:“ HiPlot”
python并行运算库 HiPlot is Facebook's Python library to support visualization of high-dimensional data ta ...
- python orm库_周边生态贡献者+1,一个TDengine的Python ORM库—crown
本文介绍了一个用于操作TDengine的 Python ORM库.本文的预期读者是,需要使用Python语言操作TDengine数据库的开发人员. 什么是ORM? ORM就是对象关系映射(Object ...
- 6.Python标准库_子进程 (subprocess包)
Vamei博客地址:http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html 这里的内容以Linux进程基础和Linux文本流为基础.s ...
最新文章
- kafaka使用 消息队列_Java使用消息队列还是直接使用线程池ExecutorService异步处理?...
- hadoop hdfs总结 NameNode部分 1
- 华为云计算之存储的分类
- 一起学nRF51xx 5 - ppi
- sql长整型_SQL性能优化,太太太太太太太有用了!
- java数组二分查找的简单例题_Java基础-练习 数组元素二分查找(折半查找)
- ubtunu打开firefox_如何在Firefox(在Lubuntu中)中打开“apt”链接?
- 我是不会运行你的代码吗?不,我是不会导入自己的数据!
- pythonlist循环添加元素_list.append()在for循环中每次添加的都是最后的一个元素汗血宝马...
- MQTT.fx客户端MQTT接入阿里云物联网平台,登录、订阅、发布消息
- JQuery Highcharts 图表控件
- Intel XDK问题
- java从0单排之java就业培训教程复习与面试题回顾——02
- weblogic安装部署
- linux 移动硬盘 mac,Macbook pro使用原生EFI在移动硬盘安装Windows+Fedora双系统
- python定义变量取值范围_python怎么限定函数自变量取值范围?
- 信息安全风险评估---矩阵法计算风险
- 随机生成中文名字的工具类
- java 迭代器的hasnext,在Python迭代器中具有hasNext?
- MATLAB----Roberts锐化滤波器