------------恢复内容开始------------python
是否担忧微信的数据流会被监视?是否担忧你和ta聊天的小秘密会被保存到某个数据库里?不要紧,如今咱们能够用Python作一个只属于你和ta的聊天渠道,来解除大家心中的担心。数据库
在咱们今天的教程中,将用到即时通信的概念,即时通信容许两人或多人同时使用网络传递文字信息、文字、语音等。即时通信通常都基于socket链接,socket链接可用于发送或接受数据,通常的组合形式是IP+端口号。安全
也就是说,在咱们的例子中,聊天的双方,由一方要承担“服务器 ” 的责任,维持一个socket服务器,等待链接进入;另外一方则是“客户端”,在服务器端维持等待状态时便可发送请求,创建链接。服务器
当你和ta想进入“小黑屋 ” 里聊天的时候,只有有一方充当服务器,另外一方充当客户端便可,做为“服务器端 ” 的那我的,在微信中将IP和端口号告诉对方,便可构建链接,在小黑屋里聊天,这个小黑屋里的数据不会被任何数据库保留(除非你本身作了一个保存的数据库)。微信
好了,基本原理咱们已经讲清楚了。不过,在开始教程以前,你得先安装好了Python网络
聊天的时候,咱们有时候会遇到双方同时发消息的状况。这种聊天方式就叫全双工聊天方式:“服务器”可向“客户端”发送消息,“客户端”也可向“服务端”发送消息,并且容许同时发送消息。多线程
服务器端怎么实现全双工的聊天方式呢?其实很简单,只要用多线程就好了,主线程用于接收客户端的链接,链接成功后新建两个线程:一个用于发送消息,一个用于接收消息:socket
首先,创建socket服务器:函数
其中,AF_INET指的是用IPv4进行通讯,而SOCK_STREAM指的是TCP协议。端口号你能够随意设定,服务器端的IP地址默认为空便可。工具
在while循环中不断等待用户的链接。若是有用户链接成功了,咱们将进入下一步,分别创建发送和接受线程:
clientsock就是咱们获得的socket链接,processRecv和processSend分别用于处理接受信息和处理发送信息:
有个小细节要注意,socket链接的sendall函数只支持bytes类型的数据,因此咱们要encode('utf-8')。
服务端的全部代码就这样,没错,就是这么简单。
客户端则更简单,主线程自己设定为接受消息,那么咱们只须要多一个线程用于发送消息便可。客户端的所有代码以下:
其中,HOST部分填写对方的IP,PORT部分填写端口号。sys.argv用于经过参数输入这两个值,好比咱们将客户端文件命名为:client.py, 在cmd中输入:
python client.py 127.0.0.1 51423
能直接传入参数执行脚本,除此以外,其余部分和服务端其实差很少。注意把接受到的数据decode一下(由于咱们发的时候encode了)。
实际上,这份代码虽然能够用,可是仍是存在许多问题的。好比在大家聊天的时候,忽然又有一我的向服务端发送链接请求怎么办?这时候咱们须要在服务端加一份拥有验证的代码,要求对方输入聊天室密码后才可创建链接。
这个密码必须是大家双方才知道的密码,任何经过第三方工具传播密码的行为都是不可靠和不安全的。这样才能够防止第三者的偷听。增长一个密码功能其实也不难,这部分交给你们本身去实现啦!
------------恢复内容结束------------