前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: Python应用宝典

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

原理简介

在我们今天的教程中,将用到即时通讯的概念,即时通讯允许两人或多人同时使用网络传递文字信息、文字、语音等。即时通讯一般都基于socket连接,socket连接可用于发送或接受数据,一般的组合形式是IP+端口号。

也就是说,在我们的例子中,聊天的双方,由一方要承担“服务器 ” 的责任,维持一个socket服务器,等待连接进入;另一方则是“客户端”,在服务器端维持等待状态时即可发送请求,建立连接。

当你和ta想进入“小黑屋 ” 里聊天的时候,只有有一方充当服务器,另一方充当客户端即可,作为“服务器端 ” 的那个人,在微信中将IP和端口号告诉对方,即可构建连接,在小黑屋里聊天,这个小黑屋里的数据不会被任何数据库保留(除非你自己做了一个保存的数据库)。

服务器端

聊天的时候,我们有时候会遇到双方同时发消息的情况。这种聊天方式就叫全双工聊天方式:“服务器”可向“客户端”发送消息,“客户端”也可向“服务端”发送消息,而且允许同时发送消息。

服务器端怎么实现全双工的聊天方式呢?其实很简单,只要用多线程就行了,主线程用于接收客户端的连接,连接成功后新建两个线程:一个用于发送消息,一个用于接收消息:

首先,建立socket服务器:

import socketimport traceback# 设定ip和端口号host = ''port = 51423 # 建立socket服务器s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.bind((host,port))s.listen() while True: # 等待连接 try: clientsock, clientaddr = s.accept() except KeyboardInterrupt: raise except: 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 _thread def processRecv(clientsock): """ 接受消息 :param clientsock: 客户端的socket连接 """ while True: data = clientsock.recv(4096) if not len(data): break print (data.decode('utf-8')) clientsock.close() def processSend(clientsock): """ 发送消息 :param clientsock: 客户端的socket连接 """ while True: data = input("> ") data = data clientsock.sendall(data.encode('utf-8')) clientsock.close() 

有个小细节要注意,socket连接的sendall函数只支持bytes类型的数据,所以我们要encode('utf-8')。

服务端的所有代码就这样,没错,就是这么简单。

客户端

客户端则更简单,主线程本身设定为接受消息,那么我们只需要多一个线程用于发送消息即可。客户端的全部代码如下:

import _threadimport sysfrom socket import * def send_message(tcpCliSock): """ 发送信息 :param tcpCliSock: 与服务端的socket连接 """ while True: message = input('> ') if not message: break tcpCliSock.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,)) while True: rdata = tcpCliSock.recv(BUFSIZ) if not rdata: break print (rdata.decode('utf-8')) tcpCliSock.close() 

其中,HOST部分填写对方的IP,PORT部分填写端口号。sys.argv用于通过参数输入这两个值,比如我们将客户端文件命名为:client.py, 在cmd中输入:

python client.py 127.0.0.1 51423

能直接传入参数执行脚本,除此之外,其他部分和服务端其实差不多。注意把接受到的数据decode一下(因为我们发的时候encode了)。

python socket清空接受区_用Python制作只属于你和ta的聊天渠道吧相关推荐

  1. python socket清空接受区_原始Python服务器

    之前我的Python教程中有人留言,表示只学Python没有用,必须学会一个框架(比如Django和web.py)才能找到工作.而我的想法是,掌握一个类似于框架的高级工具是有用的,但是基础的东西可以让 ...

  2. python socket能做什么_用python写一个聊天小程序!和女朋友的专属聊天工具!

    原标题:用python写一个聊天小程序!和女朋友的专属聊天工具! 1.UDP简介 Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP).UDP为应用程序提供了无需建立就可 ...

  3. python通信原理实验报告_【Python之旅】第五篇(一):Python Socket通信原理-阿里云开发者社区...

    只要和网络服务涉及的,就离不开Socket以及Socket编程,下面就说说Python Socket通信的基本原理. 1.Socket socket也称作"套接字",用于描述IP地 ...

  4. python远程主机强迫关闭了_[转] python 远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054...

    python socket.error: [Errno 10054] 远程主机强迫关闭了一个现有的连接.问题解决方案: 前几天使用python读取网页.因为对一个网站大量的使用urlopen操作,所以 ...

  5. python交互式和文件式_使用Python创建和自动化交互式仪表盘

    python交互式和文件式 In this tutorial, I will be creating an automated, interactive dashboard of Texas COVI ...

  6. python做审计底稿视频_最新Python教学视频,每天自学俩小时,让你offer拿到手软...

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  7. python怎么做软件程序_看 Python 超级程序员使用什么开发工具

    Python超级程序员使用的开发工具 我以个人的身份采访了几个顶尖的Python程序员,问了他们以下5个简单的问题: 当前你的主要开发任务是什么? 你在项目中使用的电脑是怎样的? 你使用什么IDE开发 ...

  8. python 按需加载_基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)...

    基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 文档转换为PDF有些图片无法完全显示,请移步我的博客查看 完成 ...

  9. python 录制网易云登陆_图说Python菜鸟版:第3章 基本语法

    一.前言 本文是作者在录制课程<Python全栈工程师魔鬼训练营>时,花费大量时间和精力整理出来的内容,历时近半年时间.在和学员的上万次互动过程中,发现Python初学者所面临的最大问题就 ...

最新文章

  1. R语言Box-Cox变换实战(Box-Cox Transformation):将非正态分布数据转换为正态分布数据、计算最佳λ、变换后构建模型
  2. 深入SpringBoot:自定义Endpoint
  3. QT的QQmlPropertyMap类的使用
  4. ZOJ-2770 Burn the Linked Camp 差分约束
  5. 最近看了两本低代码的书
  6. Unity 内嵌网页
  7. SAP License:转一篇初学者必看的文章
  8. 马云:成功与情商有关 与读书多少关系不大
  9. Redis 常见问题 与 常见错误
  10. jks签名文件转pk8
  11. 利用pm2 启动node项目
  12. 小米助手版本信息测试
  13. [渝粤教育] 西南科技大学 中国古代文学〔2〕 在线考试复习资料
  14. HDU3665Seaside(最短路径)
  15. 本地电脑如何搭建web网站,并发布到公网访问?1-2
  16. unity hdrp的TAA
  17. Compose Wheel组件。滚轮组件
  18. 极光im java_java手写一个迷你版的Tomcat代码分享
  19. windows7蓝牙怎么打开_windows7系统怎么调待机时间
  20. 处理ORA-06512错误方法

热门文章

  1. WARNING:Your password has expired --linux 用户密码过期
  2. mysql数据库优化大全
  3. JDBC事务和JTA事务的区别 --包含spring事务 声明式事务
  4. 多选Select排序
  5. request Form request QueryString
  6. 前端三大技术 HTML、CSS、JavaScript 快速入门手册
  7. [新手必备]Python 基础入门必学知识点笔记
  8. Eureka-服务发现
  9. Pod详解-资源配额
  10. ReentrantLock重入锁