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字符串替换的2种方法
Nov 30 Python
在Python中使用__slots__方法的详细教程
Apr 28 Python
教你使用python实现微信每天给女朋友说晚安
Mar 23 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
解决tensorflow模型参数保存和加载的问题
Jul 26 Python
python3.6使用tkinter实现弹跳小球游戏
May 09 Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 Python
Python常用模块os.path之文件及路径操作方法
Dec 03 Python
基于python3的socket聊天编程
Feb 17 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
Python实现快速大文件比较代码解析
Sep 04 Python
python自动化八大定位元素讲解
Jul 09 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连接mysql是否成功的代码分享
2014/01/24 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
PHP图像识别技术原理与实现
2016/10/27 PHP
PHP封装的PDO数据库操作类实例
2017/06/21 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
超轻量级的基于jquery的三级展开列表
2011/04/26 Javascript
搭建Bootstrap离线文档的方法
2016/12/02 Javascript
vue.js指令v-model实现方法
2016/12/05 Javascript
jQuery ajax实现省市县三级联动
2021/03/07 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
JS中Swiper的使用和轮播图效果
2017/08/11 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
简述pm2常用命令集合及配置文件说明
2019/05/30 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
[02:56]DOTA2亚洲邀请赛 VG出场战队巡礼
2015/02/07 DOTA
python提取页面内url列表的方法
2015/05/25 Python
Python中random模块生成随机数详解
2016/03/10 Python
Python删除Java源文件中全部注释的实现方法
2017/08/30 Python
python安装pil库方法及代码
2019/06/25 Python
python zip()函数使用方法解析
2019/10/31 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
python GUI库图形界面开发之PyQt5线程类QThread详细使用方法
2020/02/26 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
Python基于smtplib协议实现发送邮件
2020/06/03 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
新闻记者个人求职的自我评价
2013/11/28 职场文书
医生进修自我鉴定
2014/01/19 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
2015年基层党支部工作总结
2015/05/21 职场文书
校园歌手大赛主持词
2015/07/03 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android