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爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
完美解决Python2操作中文名文件乱码的问题
Jan 04 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
python selenium 获取标签的属性值、内容、状态方法
Jun 22 Python
实例讲解python中的协程
Oct 08 Python
python网络应用开发知识点浅析
May 28 Python
Python用input输入列表的实例代码
Feb 07 Python
Python3 集合set入门基础
Feb 10 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
利用Python实现最小二乘法与梯度下降算法
Feb 21 Python
Python带你从浅入深探究Tuple(基础篇)
May 15 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中防止直接访问或查看或下载config.php文件的方法
2012/07/07 PHP
php设计模式之单例、多例设计模式的应用分析
2013/06/30 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
2017/04/15 PHP
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
为开发者准备的10款最好的jQuery日历插件
2014/02/04 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
JQuery悬停控制图片轮播——代码简单
2015/08/05 Javascript
jQuery遍历DOM元素与节点方法详解
2016/04/14 Javascript
AngularJS ng-style中使用filter
2016/09/21 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
2020/07/20 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
python 获取本机ip地址的两个方法
2013/02/25 Python
Python实现方便使用的级联进度信息实例
2015/05/05 Python
python下实现二叉堆以及堆排序的示例
2017/09/29 Python
使用CodeMirror实现Python3在线编辑器的示例代码
2019/01/14 Python
Python 字典中的所有方法及用法
2020/06/10 Python
django使用channels实现通信的示例
2020/10/19 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
酒店管理毕业生自荐信
2013/10/24 职场文书
高中生学习生活的自我评价
2013/11/27 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
购房个人委托书范本
2014/10/11 职场文书
家庭困难证明
2014/10/12 职场文书
python实现简易名片管理系统
2021/04/11 Python
如何在C++中调用Python
2021/05/21 Python