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 相关文章推荐
编写自定义的Django模板加载器的简单示例
Jul 21 Python
使用numpy和PIL进行简单的图像处理方法
Jul 02 Python
Python拼接微信好友头像大图的实现方法
Aug 01 Python
Django forms组件的使用教程
Oct 08 Python
python学习之hook钩子的原理和使用
Oct 25 Python
Python生成器的使用方法和示例代码
Mar 04 Python
关于python字符串方法分类详解
Aug 20 Python
Python数学形态学实例分析
Sep 06 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
jupyter notebook清除输出方式
Apr 10 Python
总结Python连接CS2000的详细步骤
Jun 23 Python
Python&Matlab实现樱花的绘制
Apr 07 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
IStream与TStream之间的相互转换
2008/08/01 PHP
php数字游戏 计算24算法
2012/06/10 PHP
PHP代码审核的详细介绍
2013/06/13 PHP
一个简单至极的PHP缓存类代码
2015/10/23 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
完美的php分页类
2017/10/24 PHP
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
javascript学习笔记(十五) js间歇调用和超时调用
2012/06/20 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
AngularJS基础 ng-keypress 指令简单示例
2016/08/02 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
Vuex 使用 v-model 配合 state的方法
2018/11/13 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
如何区分vue中的v-show 与 v-if
2020/09/08 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
[02:16]DOTA2超级联赛专访Burning 逆袭需要抓住机会
2013/06/24 DOTA
python中字符串类型json操作的注意事项
2017/05/02 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
如何用css3实现switch组件开关的方法
2018/02/09 HTML / CSS
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
乐高西班牙官方商店:LEGO Shop ES
2019/12/01 全球购物
淘宝活动策划方案
2014/02/06 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
KTV门卫岗位职责
2014/10/09 职场文书
先进党员事迹材料
2014/12/24 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
Python实现8种常用抽样方法
2021/06/27 Python
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript
Python之matplotlib绘制折线图
2022/04/13 Python