Python实现socket非阻塞通讯功能示例


Posted in Python onNovember 06, 2019

本文实例讲述了Python实现socket非阻塞通讯功能。分享给大家供大家参考,具体如下:

非阻塞需要多线程编程

服务端

方式1: 使用threading库实现多线程

基本方法和单进程基本写法一致, 将收发部分封装为函数以便开启其他线程:

import socket
import time
import threading
def handle_socket(conn, addr):
  while True:
    data = conn.recv(1024)
    print(data.decode('utf-8'))
    time.sleep(3)
    send_data = 'got it'
    conn.send(send_data.encode('utf-8'))
  conn.close()

基本设置和调用部分: 绑定, 监听, 接受连接:

if __name__ == '__main__':
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.bind(('0.0.0.0', 8888))
  s.listen()
  while True:
    conn, addr = s.accept()
    client_thread = threading.Thread(target=handle_socket, args=[conn, addr])
    client_thread.start()

方式2: 通过继承StreamRequestHandler库实现多线程

收发部分写到handle方法中:

import socketserver
from socketserver import StreamRequestHandler
import time
class MyHandler(StreamRequestHandler):
  def handle(self):
    # addr = self.request.getpeername()
    # print('get connection from ', addr)
    # self.wfile.write('hello, thank for your connection'.encode())
    while True:
      datarecv = self.request.recv(1024)
      if not datarecv:
        break
      time.sleep(3)
      print(datarecv.decode())
      self.request.send("got it".encode())

开启

myserver = socketserver.ThreadingTCPServer(('127.0.0.1', 8888), MyHandler)
myserver.serve_forever()

客户端

客户端:

import socket
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect(('127.0.0.1', 8888))
while True:
  conn.send('hello'.encode())
  data = conn.recv(1024)
  print(data.decode())

更多关于Python相关内容可查看本站专题:《Python Socket编程技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
详解Python里使用正则表达式的ASCII模式
Nov 02 Python
Python从使用线程到使用async/await的深入讲解
Sep 16 Python
Python操作mongodb数据库的方法详解
Dec 08 Python
说说如何遍历Python列表的方法示例
Feb 11 Python
Python Django框架实现应用添加logging日志操作示例
May 17 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
PyQt5 如何让界面和逻辑分离的方法
Mar 24 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
Aug 17 Python
利用python汇总统计多张Excel
Sep 22 Python
如何利用pygame实现打飞机小游戏
May 30 Python
Python实现位图分割的效果
Nov 20 Python
Python中生成一个指定长度的随机字符串实现示例
Nov 06 #Python
详解Python list和numpy array的存储和读取方法
Nov 06 #Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
Nov 06 #Python
Python list与NumPy array 区分详解
Nov 06 #Python
Django实现WebSSH操作物理机或虚拟机的方法
Nov 06 #Python
django 简单实现登录验证给你
Nov 06 #Python
Python数据可视化:箱线图多种库画法
Nov 06 #Python
You might like
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
js模拟select下拉菜单控件的代码
2013/05/08 Javascript
jQuery根据纬度经度查看地图处理程序
2013/05/08 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
浅析Vue.js中v-bind v-model的使用和区别
2018/12/04 Javascript
arctext.js实现文字平滑弯曲弧形效果的插件
2019/05/13 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
2020/04/13 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
Vue性能优化的方法
2020/07/30 Javascript
Python中使用SAX解析xml实例
2014/11/21 Python
python制作花瓣网美女图片爬虫
2015/10/28 Python
python实现简易通讯录修改版
2018/03/13 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
关于python字符串方法分类详解
2019/08/20 Python
python实现手势识别的示例(入门)
2020/04/15 Python
HTML5+JS实现俄罗斯方块原理及具体步骤
2013/11/29 HTML / CSS
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
大学生毕业的自我鉴定
2013/11/13 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
四年级科学教学反思
2014/02/10 职场文书
买卖协议书范本
2014/04/21 职场文书
法学院毕业生求职信
2014/06/25 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
JavaScript实现酷炫的鼠标拖尾特效
2022/02/18 Javascript
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL
SpringBoot Http远程调用的方法
2022/08/14 Java/Android