如何用Python编写一个聊天室

Python07

如何用Python编写一个聊天室,第1张

python聊天室(python2.7版本):

暂时先给出两种版本的,tcp+udp

都是分别运行server.py和client.py,就可以进行通讯了。

别外还有websocket版本,这个是有web界面的和基本web服务的,如果需要的话,我会把基本的代码贴一版上来。

TCP版本:

socket-tcp-server.py(服务端):

#-*- encoding:utf-8 -*-

#socket.getaddrinfo(host,  port, family=0, socktype=0, proto=0, flags=0)

#根据给定的参数host/port,相应的转换成一个包含用于创建socket对象的五元组,

#参数host为域名,以字符串形式给出代表一个IPV4/IPV6地址或者None.

#参数port如果字符串形式就代表一个服务名,比如“http”"ftp""email"等,或者为数字,或者为None

#参数family为地主族,可以为AF_INET  ,AF_INET6 ,AF_UNIX.

#参数socktype可以为SOCK_STREAM(TCP)或者SOCK_DGRAM(UDP)

#参数proto通常为0可以直接忽略

#参数flags为AI_*的组合,比如AI_NUMERICHOST,它会影响函数的返回值

#附注:给参数host,port传递None时建立在C基础,通过传递NULL。

#该函数返回一个五元组(family, socktype, proto, canonname, sockaddr),同时第五个参数sockaddr也是一个二元组(address, port)

#更多的方法及链接请访问

# Echo server program

from socket import *

import sys

import threading

from time import ctime

from time import localtime

import traceback

import time

import subprocess

reload(sys)

sys.setdefaultencoding("utf8")

HOST='127.0.0.1'

PORT=8555  #设置侦听端口

BUFSIZ=1024

class TcpServer():

    def __init__(self):

        self.ADDR=(HOST, PORT)

        try:

            self.sock=socket(AF_INET, SOCK_STREAM)

            print '%d is open' % PORT

            self.sock.bind(self.ADDR)

            self.sock.listen(5)

            #设置退出条件

            self.STOP_CHAT=False

            # 所有监听的客户端

            self.clients = {}

            self.thrs = {}

            self.stops = []

        except Exception,e:

            print "%d is down" % PORT

            return False

    def IsOpen(ip, port):

        s = socket(AF_INET, SOCK_STREAM)

        try:

            s.connect((ip, int(port)))

            # s.shutdown(2)

            # 利用shutdown()函数使socket双向数据传输变为单向数据传输。shutdown()需要一个单独的参数,

            # 该参数表示s了如何关闭socket。具体为:0表示禁止将来读;1表示禁止将来写;2表示禁止将来读和写。

            print '%d is open' % port

            return True

        except:

            print '%d is down' % port

            return False

    def listen_client(self):

        while not self.STOP_CHAT:

            print(u'等待接入,侦听端口:%d' % (PORT))

            self.tcpClientSock, self.addr=self.sock.accept()

            print(u'接受连接,客户端地址:',self.addr)

            address = self.addr

            #将建立的client socket链接放到列表self.clients中

            self.clients[address] = self.tcpClientSock

            #分别将每个建立的链接放入进程中,接收且分发消息

            self.thrs[address] = threading.Thread(target=self.readmsg, args=[address])

            self.thrs[address].start()

            time.sleep(0.5)

    def readmsg(self,address):

        #如果地址不存在,则返回False

        if address not in self.clients:

            return False

        #得到发送消息的client socket

        client = self.clients[address]

        while True:

            try:

                #获取到消息内容data

                data=client.recv(BUFSIZ)

            except:

                print(e)

                self.close_client(address)

                break

            if not data:

                break

            #python3使用bytes,所以要进行编码

            #s='%s发送给我的信息是:[%s] %s' %(addr[0],ctime(), data.decode('utf8'))

            #对日期进行一下格式化

            ISOTIMEFORMAT='%Y-%m-%d %X'

            stime=time.strftime(ISOTIMEFORMAT, localtime())

            s=u'%s发送给我的信息是:%s' %(str(address),data.decode('utf8'))

            #将获得的消息分发给链接中的client socket

            for k in self.clients:

                self.clients[k].send(s.encode('utf8'))

                self.clients[k].sendall('sendall:'+s.encode('utf8'))

                print str(k)

            print([stime], ':', data.decode('utf8'))

            #如果输入quit(忽略大小写),则程序退出

            STOP_CHAT=(data.decode('utf8').upper()=="QUIT")

            if STOP_CHAT:

                print "quit"

                self.close_client(address)

                print "already quit"

                break

    def close_client(self,address):

        try:

            client = self.clients.pop(address)

            self.stops.append(address)

            client.close()

            for k in self.clients:

                self.clients[k].send(str(address) + u"已经离开了")

        except:

            pass

        print(str(address)+u'已经退出')

if __name__ == '__main__':

    tserver = TcpServer()

    tserver.listen_client()

    

 ——————————华丽的分割线——————————       

    

 socket-tcp-client.py (客户端):

 

#-*- encoding:utf-8 -*-

from socket import *

import sys

import threading

import time

reload(sys)

sys.setdefaultencoding("utf8")

#测试,连接本机

HOST='127.0.0.1'

#设置侦听端口

PORT=8555

BUFSIZ=1024

class TcpClient:

    ADDR=(HOST, PORT)

    def __init__(self):

        self.HOST = HOST

        self.PORT = PORT

        self.BUFSIZ = BUFSIZ

        #创建socket连接

        self.client = socket(AF_INET, SOCK_STREAM)

        self.client.connect(self.ADDR)

        #起一个线程,监听接收的信息

        self.trecv = threading.Thread(target=self.recvmsg)

        self.trecv.start()

    def sendmsg(self):

        #循环发送聊天消息,如果socket连接存在则一直循环,发送quit时关闭链接

        while self.client.connect_ex(self.ADDR):

            data=raw_input('>:')

            if not data:

                break

            self.client.send(data.encode('utf8'))

            print(u'发送信息到%s:%s' %(self.HOST,data))

            if data.upper()=="QUIT":

                self.client.close()

                print u"已关闭"

                break

    def recvmsg(self):

        #接收消息,如果链接一直存在,则持续监听接收消息

        try:

            while self.client.connect_ex(self.ADDR):

                data=self.client.recv(self.BUFSIZ)

                print(u'从%s收到信息:%s' %(self.HOST,data.decode('utf8')))

        except Exception,e:

            print str(e)

if __name__ == '__main__':

    client=TcpClient()

    client.sendmsg()

UDP版本:

socket-udp-server.py

# -*- coding:utf8 -*-

import sys

import time

import traceback

import threading

reload(sys)

sys.setdefaultencoding('utf-8')

import socket

import traceback

HOST = "127.0.0.1"

PORT = 9555

CHECK_PERIOD = 20

CHECK_TIMEOUT = 15

class UdpServer(object):

    def __init__(self):

        self.clients = []

        self.beats = {}

        self.ADDR = (HOST,PORT)

        try:

            self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

            self.sock.bind(self.ADDR)       # 绑定同一个域名下的所有机器

            self.beattrs = threading.Thread(target=self.checkheartbeat)

            self.beattrs.start()

        except Exception,e:

            traceback.print_exc()

            return False

    def listen_client(self):

        while True:

            time.sleep(0.5)

            print "hohohohohoo"

            try:

                recvData,address = self.sock.recvfrom(2048)

                if not recvData:

                    self.close_client(address)

                    break

                if address in self.clients:

                    senddata = u"%s发送给我的信息是:%s" %(str(address),recvData.decode('utf8'))

                    if recvData.upper() == "QUIT":

                        self.close_client(address)

                    if recvData == "HEARTBEAT":

                        self.heartbeat(address)

                        continue

                else:

                    self.clients.append(address)

                    senddata = u"%s发送给我的信息是:%s" %(str(address),u'进入了聊天室')

                for c in self.clients:

                    try:

                        self.sock.sendto(senddata,c)

                    except Exception,e:

                        print str(e)

                        self.close_client(c)

            except Exception,e:

                # traceback.print_exc()

                print str(e)

                pass

    def heartbeat(self,address):

        self.beats[address] = time.time()

    def checkheartbeat(self):

        while True:

            print "checkheartbeat"

            print self.beats

            try:

                for c in self.clients:

                    print time.time()

                    print self.beats[c]

                    if self.beats[c] + CHECK_TIMEOUT <time.time():

                        print u"%s心跳超时,连接已经断开" %str(c)

                        self.close_client(c)

                    else:

                        print u"checkp%s,没有断开" %str(c)

            except Exception,e:

                traceback.print_exc()

                print str(e)

                pass

            time.sleep(CHECK_PERIOD)

    def close_client(self,address):

        try:

            if address in self.clients:

                self.clients.remove(address)

                if self.beats.has_key(address):

                    del self.beats[address]

                print self.clients

            for c in self.clients:

                self.sock.sendto(u'%s已经离开了' % str(address),c)

            print(str(address)+u'已经退出')

        except Exception,e:

            print str(e)

            raise

if __name__ == "__main__":

    udpServer = UdpServer()

    udpServer.listen_client()

    

——————————华丽的分割线——————————    

socket-udp-client.py:

# -*- coding:utf8 -*-

import sys

import threading

import time

reload(sys)

sys.setdefaultencoding('utf-8')

import socket

HOST = "127.0.0.1"

PORT = 9555

#BEAT_PORT = 43278

BEAT_PERIOD = 5

class UdpClient(object):

    def __init__(self):

        self.clientsock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

        self.HOST = HOST

        self.ADDR = (HOST,PORT)

        self.clientsock.sendto(u'请求建立链接',self.ADDR)

        self.recvtrs = threading.Thread(target=self.recvmsg)

        self.recvtrs.start()

        self.hearttrs = threading.Thread(target=self.heartbeat)

        self.hearttrs.start()

    def sendmsg(self):

        while True:

            data = raw_input(">:")

            if not data:

                break

            self.clientsock.sendto(data.encode('utf-8'),self.ADDR)

            if data.upper() == 'QUIT':

                self.clientsock.close()

                break

    def heartbeat(self):

        while True:

            self.clientsock.sendto('HEARTBEAT',self.ADDR)

            time.sleep(BEAT_PERIOD)

    def recvmsg(self):

        while True:

            recvData,addr = self.clientsock.recvfrom(1024)

            if not recvData:

                break

            print(u'从%s收到信息:%s' %(self.HOST,recvData.decode('utf8')))

if __name__ == "__main__":

    udpClient = UdpClient()

    udpClient.sendmsg()

前言:

不管学习哪门语言都希望能做出实际的东西来,这个实际的东西当然就是项目啦,不用多说大家都知道学编程语言一定要做项目才行。

这里整理了70个Python实战项目列表,都有完整且详细的教程,你可以从中选择自己想做的项目进行参考学习练手,你也可以从中寻找灵感去做自己的项目。

1、【Python 图片转字符画】

2、【200行Python代码实现2048】

3、【Python3 实现火车票查询工具】

4、【高德API+Python解决租房问题 】

5、【Python3 色情图片识别】

6、【Python 破解验证码】

7、【Python实现简单的Web服务器】

8、【pygame开发打飞机 游戏 】

9、【Django 搭建简易博客】

10、【Python基于共现提取《釜山行》人物关系】

11、【基于scrapy爬虫的天气数据采集(python)】

12、【Flask 开发轻博客】

13、【Python3 图片隐写术】

14、【Python 实现简易 Shell】

15、【使用 Python 解数学方程】

16、【PyQt 实现简易浏览器】

17、【神经网络实现手写字符识别系统 】

18、【Python 实现简单画板】

19、【Python实现3D建模工具】

20、【NBA常规赛结果预测——利用Python进行比赛数据分析】

21、【神经网络实现人脸识别任务】

22、【Python文本解析器】

23、【Python3 &OpenCV 视频转字符动画】

24、【Python3 实现淘女郎照片爬虫 】

25、【Python3实现简单的FTP认证服务器】

26、【基于 Flask 与 MySQL 实现番剧推荐系统】

27、【Python 实现端口扫描器】

28、【使用 Python 3 编写系列实用脚本】

29、【Python 实现康威生命 游戏 】

30、【川普撞脸希拉里(基于 OpenCV 的面部特征交换) 】

31、【Python 3 实现 Markdown 解析器】

32、【Python 气象数据分析 -- 《Python 数据分析实战》】

33、【Python实现键值数据库】

34、【k-近邻算法实现手写数字识别系统】

35、【ebay在线拍卖数据分析】

36、【Python 实现英文新闻摘要自动提取 】

37、【Python实现简易局域网视频聊天工具】

38、【基于 Flask 及爬虫实现微信 娱乐 机器人】

39、【Python实现Python解释器】

40、【Python3基于Scapy实现DDos】

41、【Python 实现密码强度检测器】

42、【使用 Python 实现深度神经网络】

43、【Python实现从excel读取数据并绘制成精美图像】

44、【人机对战初体验:Python基于Pygame实现四子棋 游戏 】

45、【Python3 实现可控制肉鸡的反向Shell】

46、【Python打造漏洞扫描器 】

47、【Python应用马尔可夫链算法实现随机文本生成】

48、【数独 游戏 的Python实现与破解】

49、【使用Python定制词云】

50、【Python开发简单计算器】

51、【Python 实现 FTP 弱口令扫描器】

52、【Python实现Huffman编码解压缩文件】

53、【Python实现Zip文件的暴力破解 】

54、【Python3 智能裁切图片】

55、【Python实现网站模拟登陆】

56、【给Python3爬虫做一个界面.妹子图网实战】

57、【Python 3 实现图片转彩色字符】

58、【自联想器的 Python 实现】

59、【Python 实现简单滤镜】

60、【Flask 实现简单聊天室】

61、【基于PyQt5 实现地图中定位相片拍摄位置】

62、【Python实现模板引擎】

63、【Python实现遗传算法求解n-queens问题】

64、【Python3 实现命令行动态进度条】

65、【Python 获取挂号信息并邮件通知】

66、【Python实现java web项目远端自动化更新部署】

67、【使用 Python3 编写 Github 自动周报生成器】

68、【使用 Python 生成分形图片】

69、【Python 实现 Redis 异步客户端】

70、【Python 实现中文错别字高亮系统】

最后:

以上项目列表希望可以给你在Python学习中带来帮助~

获取方式:转发 私信“1”