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 土拨鼠库_为了应对某人的需求,写了一个简单的聊天室内容相关推荐

  1. python开发一个简单的聊天室

    使用python的twisted框架编写一个简单的聊天室 下面是基本架构 基本架构图 -- coding:utf-8 -- from twisted.internet.protocol import ...

  2. python 土拨鼠库_傻傻分不清楚系列|Python中各种时间处理方法(上)

    相信大多数数据分析师在入手Python的时候,在学习到time库与datetime库时,都会对两个库里面长得很像,又相互有关联的各种类和方法感到非常窝心.当接触到pandas处理时间序列的方法时,再次 ...

  3. python写机器人程序_用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

  4. 通过python 构建一个简单的聊天服务器

    构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使 ...

  5. python聊天室详细教程_python简单实现聊天室功能(代码教程)

    聊天室程序需求: 我们要实现的是简单的聊天室的例子,就是允许多个人同时一起聊天,每个人发送的消息所有人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.如下图: 这里我们首先要 ...

  6. python gis库_使用开放的python库自动化GIS和遥感工作流

    python gis库 Over my career I've worked on many geospatial related projects using the ArcGIS platform ...

  7. python并行运算库_最佳并行绘图Python库简介:“ HiPlot”

    python并行运算库 HiPlot is Facebook's Python library to support visualization of high-dimensional data ta ...

  8. python orm库_周边生态贡献者+1,一个TDengine的Python ORM库—crown

    本文介绍了一个用于操作TDengine的 Python ORM库.本文的预期读者是,需要使用Python语言操作TDengine数据库的开发人员. 什么是ORM? ORM就是对象关系映射(Object ...

  9. 6.Python标准库_子进程 (subprocess包)

    Vamei博客地址:http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html 这里的内容以Linux进程基础和Linux文本流为基础.s ...

最新文章

  1. kafaka使用 消息队列_Java使用消息队列还是直接使用线程池ExecutorService异步处理?...
  2. hadoop hdfs总结 NameNode部分 1
  3. 华为云计算之存储的分类
  4. 一起学nRF51xx 5 -  ppi
  5. sql长整型_SQL性能优化,太太太太太太太有用了!
  6. java数组二分查找的简单例题_Java基础-练习 数组元素二分查找(折半查找)
  7. ubtunu打开firefox_如何在Firefox(在Lubuntu中)中打开“apt”链接?
  8. 我是不会运行你的代码吗?不,我是不会导入自己的数据!
  9. pythonlist循环添加元素_list.append()在for循环中每次添加的都是最后的一个元素汗血宝马...
  10. MQTT.fx客户端MQTT接入阿里云物联网平台,登录、订阅、发布消息
  11. JQuery Highcharts 图表控件
  12. Intel XDK问题
  13. java从0单排之java就业培训教程复习与面试题回顾——02
  14. weblogic安装部署
  15. linux 移动硬盘 mac,Macbook pro使用原生EFI在移动硬盘安装Windows+Fedora双系统
  16. python定义变量取值范围_python怎么限定函数自变量取值范围?
  17. 信息安全风险评估---矩阵法计算风险
  18. 随机生成中文名字的工具类
  19. java 迭代器的hasnext,在Python迭代器中具有hasNext?
  20. MATLAB----Roberts锐化滤波器

热门文章

  1. 基于stknx 的 usb to knx 调试
  2. 射频、中频、基带拉远
  3. java常用工具类 - 全角转半角、半角转全角
  4. vue+elementUI 路由拦截提示
  5. 通达信缠论底分型选股公式,处理了包含关系
  6. EndNote参考文献导入
  7. PLC-Recorder的免费功能,比你想得要强大,还需要破解吗?
  8. oracle如何kill锁中的sid,杀掉Oracle进程中的死锁的具体方案。
  9. SQL Server2008r2审计配置
  10. VS2013 + WDK7.6搭建驱动开发环境