当前位置: 首页 > 后端技术 > Python

快来用Python打造一个只属于你和ta的聊天频道吧

时间:2023-03-26 12:21:20 Python

担心微信流量被监控?你是否担心和ta聊天的小秘密会被保存在某个数据库中?没关系,现在我们可以用Python做一个只属于你和ta的聊天频道,解除你的后顾之忧。1.原理介绍在我们今天的教程中,我们将使用即时通讯的概念。即时通讯允许两个或两个以上的人使用网络同时传送文字信息、文本、语音等。即时通讯一般是基于socket连接,可以用来发送或接收数据,一般的组合是IP+端口号。也就是说,在我们的例子中,聊天的双方,一方要承担起“服务器”的责任,维护一个socket服务器,等待连接进入;对方是“客户端”,马上可以发送请求建立连接。当你和ta要进入“小黑屋”聊天时,只有一方充当服务器,另一方充当客户端。你可以在小黑屋里建立联系和聊天。这个小黑屋里的数据不会被任何数据库保留(除非你自己做一个保存的数据库)。2.代码写好了,基本原理已经解释清楚了。但是,在开始本教程之前,您必须先安装Python。如果你还没有安装,可以看这篇文章:https://pythondict.com/python-tutorials/how-to-install-python/2.1服务器端聊天有时候,我们有时会遇到双方发送消息的情况同一时间。这种聊天模式称为全双工聊天模式:“服务器”可以向“客户端”发送消息,“客户端”也可以向“服务器”发送消息,并且允许同时发送消息.服务器端如何实现全双工聊天?其实很简单,只要用多线程,主线程就是用来接收客户端的连接。连接成功后,新建两个线程,一个用于发送消息,一个用于接收消息:首先创建一个socketserver:importsocketimporttraceback#设置ip和端口号host=''port=51423#建立socketservers=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind((host,port))s.listen()whileTrue:#等待连接try:clientsock,clientaddr=s.accept()exceptKeyboardInterrupt:raiseexcept:traceback.print_exc()continue其中AF_INET是指与IPv4通信,SOCK_STREAM是指TCP协议。端口号可以任意设置,服务器IP地址默认为空。在while循环中不断等待用户的连接。如果用户连接成功,我们将进入下一步,分别建立发送和接收线程:#建立接收线程t=_thread.start_new_thread(processRecv,(clientsock,))#建立发送线程r=_thread.start_new_thread(processSend,(clientsock,))clientsock是我们拿到的socket连接,processRecv和processSend分别用来处理接收信息和处理发送信息:import_threaddefprocessRecv(clientsock):"""Acceptmessage:paramclientsock:client'ssocketconnection"""whileTrue:data=clientsock.recv(4096)ifnotlen(data):breakprint(data.decode('utf-8'))clientsock.close()defprocessSend(clientsock):"""发送消息:paramclientsock:client'ssocketconnection"""whileTrue:data=input(">")data=dataclientsock.sendall(data.encode('utf-8'))clientsock.close()有个小细节要补注意,socket连接的sendall函数只支持bytes类型的数据,所以我们需要编码('utf-8')。服务器端所有的代码都是这样的,没错,就是这么简单。2.2Client客户端比较简单。主线程本身设置为接收消息,所以我们只需要多一个线程来发送消息。客户端的全部代码如下:#-*-coding:utf-8-*-import_threadimportsysfromsocketimport*defsend_message(tcpCliSock):"""发送消息:paramtcpCliSock:连接到服务端的socket"""whileTrue:message=input('>')如果不是message:breaktcpCliSock.send(message.encode('utf-8'))tcpCliSock.close()if(len(sys.argv)<3):HOST='localhost'PORT=51423else:HOST=sys.argv[1]PORT=int(sys.argv[2])BUFSIZ=1024ADDR=(HOST,PORT)tcpCliSock=socket(AF_INET,SOCK_STREAM)tcpCliSock.connect(ADDR)#建立发送消息线程s=_thread.start_new_thread(send_message,(tcpCliSock,))whileTrue:rdata=tcpCliSock.recv(BUFSIZ)ifnotrdata:breakprint(rdata.decode('utf-8'))tcpCliSock.close()其中,HOST部分填写对方IP,PORT部分填写端口号。sys.argv就是用来通过参数输入这两个值的。比如我们将客户端文件命名为:client.py,在cmd中输入:pythonclient.py127.0.0.151423直接传入参数执行脚本。除此之外,其他部分其实和服务器类似。注意解码接收到的数据(因为我们发送的时候已经编码了)。3.改进其实这段代码虽然可以用,但是还是有很多问题。比如你在聊天的时候,突然有人向服务器发送连接请求怎么办?这时候我们就需要在服务器端添加一个带有验证的代码,要求对方输入聊天室的密码才能建立连接。这个密码必须是你们双方都知道的,任何通过第三方工具传播密码的行为都是不可靠和不安全的。这样,可以防止第三方窃听。添加密码功能并不难,这部分留给大家自己实现吧!本文完整源码请在【Python实战宝典】中下载公众号后台回复:聊天频道。这是我们文章的结尾。如果你今天想要我们的Python教程,请继续关注我们。如果对您有帮助,请在下方点赞或观看。如果您有任何问题,可以在下方留言区留言。我们会耐心解答!Python实战宝典(pythondict.com)不只是一个合集欢迎关注公众号:Python实战宝典原文来自Python实战宝典:快来用Python打造只属于你和TA的聊天频道