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实现端口复用实例代码
Jul 03 Python
Python每天必学之bytes字节
Jan 28 Python
Python多进程原理与用法分析
Aug 21 Python
python对日志进行处理的实例代码
Oct 06 Python
Python根据文件名批量转移图片的方法
Oct 21 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
python global关键字的用法详解
Sep 05 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 Python
浅谈在django中使用redirect重定向数据传输的问题
Mar 13 Python
python em算法的实现
Oct 03 Python
python数据抓取3种方法总结
Feb 07 Python
python实现学员管理系统(面向对象版)
Jun 05 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函数的实现原理及性能分析(一)
2015/05/13 PHP
fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
2015/09/20 PHP
PHP的简单跳转提示的实现详解
2019/03/14 PHP
Nginx+php配置文件及原理解析
2020/12/09 PHP
学习YUI.Ext 第四天--对话框Dialog的使用
2007/03/10 Javascript
网上应用的一个不错common.js脚本
2007/08/08 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
node.js中的console.trace方法使用说明
2014/12/09 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
jQuery的ajax和遍历数组json实例代码
2016/08/01 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
JS实现颜色动态淡化效果
2017/03/06 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
详解PHP后期静态绑定分析与应用
2018/03/21 Javascript
vuex进阶知识点巩固
2018/05/20 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
python命令行参数sys.argv使用示例
2014/01/28 Python
跟老齐学Python之list和str比较
2014/09/20 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
Python之Numpy的超实用基础详细教程
2019/10/23 Python
通过Canvas及File API缩放并上传图片完整示例
2013/08/08 HTML / CSS
比利时买床:Beter Bed
2017/12/06 全球购物
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
汽车专业毕业生自荐信
2013/11/03 职场文书
2014年数学教研组工作总结
2014/12/06 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python
JavaScript实现两个数组的交集
2022/03/25 Javascript
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android