Python3,多线程,多客户端,广播数据

#!/usr/bin/env python3

import time
import threading
import queue
import socket # 三个线程:
# 线程1:产生递增的数字,转成字符串放到队列中
# 线程2:监听端口,将产生的连接放到列表中
# 线程3:从队列中取出数字,遍历连接列表,发送到所有客户端 # 线程1:产生递增的数字,转成字符串放到队列中
class Producer(threading.Thread): def __init__(self, work_queue):
super().__init__() # 必须调用
self.work_queue = work_queue def run(self):
#print("Begin produce...")
num = 1
while True:
self.work_queue.put(str(num))
num = num+1
time.sleep(1) # 暂停1秒 # 线程2:监听端口,将产生的连接放到列表中
class SocketServer(threading.Thread): def __init__(self, socket_list):
super().__init__()
self.socket_list = socket_list def run(self):
sock = socket.socket()
sock.bind(('', 9090))
sock.listen(5)
print("Start listen...")
while True:
conn, addr = sock.accept()
print("Connect by", addr)
self.socket_list.append((conn, addr)) # 线程3:从队列中取出数字,遍历连接列表,发送到所有客户端
class Printer(threading.Thread): def __init__(self, work_queue, socket_list):
super().__init__() # 必须调用
self.work_queue = work_queue
self.socket_list = socket_list def run(self):
while True:
num = self.work_queue.get() # 当队列为空时,会阻塞,直到有数据
for sock, addr in self.socket_list: # 遍历保存连接的列表
print("Send", num, "To", addr)
try:
sock.sendall(bytes(num + '\r\n', 'utf-8')) # 把字符串转换成字节数组发送
except:
print("Disconnect by", addr) # 如果连接断开,发送会失败
self.socket_list.remove((sock, addr)) # 从列表中删除断开的连接 def main():
work_queue = queue.Queue()
socket_list = [] # 为了更安全可靠,从多线程访问列表时应该加锁,
# 这里做了简化,因为列表的增加删除操作基本上可以认为是线程安全的 socket_server = SocketServer(socket_list)
socket_server.daemon = True
socket_server.start() printer = Printer(work_queue, socket_list)
printer.daemon = True # 当主线程退出时子线程也退出
printer.start() producer = Producer(work_queue)
producer.daemon = True # 当主线程退出时子线程也退出
producer.start() time.sleep(1) # 这里要暂停一下,否则执行下一条语句时,会因队列为空而直接返回
work_queue.join() # 主线程会停在这里,直到所有数字被get(),并且task_done(),因为没有调用task_done(),所在这里会一直阻塞,直到用户按^C if __name__ == '__main__':
main()

https://docs.python.org/3.1/library/asynchat.html#module-asynchat

https://docs.python.org/3.1/library/asyncore.html

https://docs.python.org/3/library/socket.html

https://docs.python.org/3.2/library/socketserver.html

http://stackoverflow.com/questions/6319207/are-lists-thread-safe

Python socket 广播信息到所有连接的客户端的更多相关文章

  1. Python socket实现处理多个连接

       socket实现处理多个连接 实现处理多个连接 使用whlie循环实现多个客户端,排队请求服务端 循环监听端口发送信息(windos,Linux) 1.Linux 系统如果客户端断开连接,会循环 ...

  2. python socket 编程之三:长连接、短连接以及心跳

    长连接:开启一个socket连接,收发完数据后,不立刻关闭连接,可以多次收发数据包. 短连接:开启一个socket连接,收发完数据后,立刻关闭连接. 心跳:长连接在没有数据通信时,定时发送数据包(心跳 ...

  3. python socket 编程之三:长连接、短连接以及心跳(转药师Aric的文章)

    长连接:开启一个socket连接,收发完数据后,不立刻关闭连接,可以多次收发数据包. 短连接:开启一个socket连接,收发完数据后,立刻关闭连接. 心跳:长连接在没有数据通信时,定时发送数据包(心跳 ...

  4. JAVA Socket(多个客户同时连接,信息共享) client (java/ruby)

    第一步 充分理解Socket 1.什么是socket 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字" ...

  5. python+socket实现网络信息交互及文件传输

    Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket又称"套接字",应用程序通常通过"套接字" ...

  6. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  7. python socket编程 实现简单p2p聊天程序

    目标是写一个python的p2p聊天的项目,这里先说一下python socket的基础课程 一.Python Socket 基础课程 Socket就是套接字,作为BSD UNIX的进程通信机制,取后 ...

  8. Python Socket 编程——聊天室演示样例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket ...

  9. python socket理解

    socket 所谓套接字(Socket),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象.一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制.从所处的地位来讲 ...

随机推荐

  1. 1像素HR技巧(兼容各浏览器)

    hr{color:#ccc;height:1px;border:0px;border-top:1px solid #ccc;margin:0px;padding:0px;overflow:hidden ...

  2. 转:perror和strerror的区别

    概述: perror和strerror都是C语言提供的库函数,用于获取与erno相关的错误信息,区别不大,用法也简单.最大的区别在于perror向stderr输出结果,而 strerror向stdou ...

  3. _CrtDumpMemoryLeaks报告程序中的内存泄露问题(简单示例代码)

    // .h 文件 #pragma once class CConsoleDump { public: explicit CConsoleDump(LPCTSTR lpszWindowTitle = N ...

  4. Android 获取imageview的图,在另一个imageview里显示。

    当我点击默认头像里的其中一个然后在点确定就在最上面的那个imageview里显示选择的头像.求大神. img1和img2都是ImageView,要把img1中的图片显示到img2中 前景(对应src属 ...

  5. Open Wifi SSID Broadcast vulnerability

    Open Wifi SSID Broadcast vulnerability 0x00 前言 前几天,看到微博上@RAyH4c分享了一份老外关于wifi钓鱼的文章,觉得挺好的,便翻译了一下.第一次翻译 ...

  6. [Tips]ASP.NET MVC 发布到服务器后Model中属性相关的Attribute失效

    Asp.net MVC4 开发的项目,发布到真实环境环境后Model中的一个属性设置的了Attribute,但是这些Attribute都失效. 经过对比和坚持代码发现控制长度的Attribute使用错 ...

  7. hdu-1800

    思路: 这题被坑的不轻. 首先花了一段时间想明白了思路是要找出现次数最多数字,以为这题就这样解决了,结果发现每个数字的最大长度是30,long long都装不下,因此就要用字符串来保存处理.然后在in ...

  8. 使用python进行接口测试(二)

    之前使用过urllib和urllib2做接口测试,在做的途中,感觉使用urllib2直接进行的get,post 请求并没有那么好用.作为测试人员,所需要的测试工具应当以方便为第一要务,测试的耗时只要是 ...

  9. 40 个重要的 HTML5 面试问题及答案

    本文将列出40个重要的HTML 5面试问题及答案,祝各位求职顺利. 目录 介绍 Canvas和SVG图形之间的区别是什么? 如何使用Canvas和SVG绘制矩形? 什么是CSS选择器? 如何使用ID值 ...

  10. hdu 4605-Magic Ball Game(树状数组)

    题目大意: 给你一棵二叉树,每个节点有一个w值,现在有一颗小球,值为x,从根节点往下掉,如果w==x,那么它就会停止:如果w>x,那么它往左.右儿子的概率都是1.2:如果w<x,那么它往左 ...