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的Django框架中Manager方法的使用
Jul 21 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
利用Django内置的认证视图实现用户密码重置功能详解
Nov 24 Python
Python实现自定义顺序、排列写入数据到Excel的方法
Apr 23 Python
Pandas实现数据类型转换的一些小技巧汇总
May 07 Python
Python基于mysql实现学生管理系统
Feb 21 Python
Python+OpenCV图像处理——实现轮廓发现
Oct 23 Python
Python getsizeof()和getsize()区分详解
Nov 20 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
python解包概念及实例
Feb 17 Python
python实现ROA算子边缘检测算法
Apr 05 Python
python 闭包函数详细介绍
Apr 19 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
PHP和Mysqlweb应用开发核心技术-第1部分 Php基础-2 php语言介绍
2011/07/03 PHP
解析thinkphp中的导入文件标签
2013/06/20 PHP
PHP读取CURL模拟登录时生成Cookie文件的方法
2014/11/04 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
javascript中的几个运算符
2007/06/29 Javascript
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
Windows8下搭建Node.js开发环境教程
2014/09/03 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
javascript HTML5 Canvas实现圆盘抽奖功能
2016/04/11 Javascript
AngularJS中$http服务常用的应用及参数
2016/08/22 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
js图片延迟加载(Lazyload)三种实现方式
2017/03/01 Javascript
微信小程序 wepy框架与iview-weapp的用法详解
2019/04/10 Javascript
教你使用vue-cli快速构建的小说阅读器
2019/05/13 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
node+vue实现文件上传功能
2020/05/28 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
跟老齐学Python之Import 模块
2014/10/13 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
Python使用pymongo库操作MongoDB数据库的方法实例
2019/02/22 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
使用phonegap克隆和删除联系人的实现方法
2017/03/31 HTML / CSS
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
暑期社会实践方案
2014/02/05 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
营销学习心得体会
2014/09/12 职场文书
查摆问题整改措施
2014/10/24 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
2014年优质护理服务工作总结
2014/11/14 职场文书
2014年乡镇民政工作总结
2014/12/02 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
公司地址变更通知
2015/04/25 职场文书
党性修养心得体会2016
2016/01/21 职场文书
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏