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. DbUtility-第一次接触

    DbUtility这个以前就知道,可是由于底层是4.5的框架,我就一直没有仔细看过,最近自己的开发框架升级到了4.5,就开始学习这个组件. 总体来说,这个组件用起来非常简单.举例说明: await d ...

  2. Grunt Server:Fatal error: Port 35729 is already in use by another process.

    提示35729端口被占用,使用lsof命令进行查看: y@y:yo-test$ lsof -i : COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ...

  3. .net performance

    http://msdn.microsoft.com/en-us/library/ms173196.aspx http://www.zhihu.com/question/20314377 http:// ...

  4. AD6反相打印设置

    高级选项-右键选Insert Layer插入要打印的Mechanical 1层 要打印的层全选Full.顶层TOP Layer或底层Bottom Layer.机械层Mechanical 1 分享:  

  5. ListView的getFirstVisiblePosition等方法返回的是哪个对象

    int firstPosition = lisView.getFirstVisiblePosition(); int lastPosition = lisView.getLastVisiblePosi ...

  6. 寻找第K小元素

    要在一个序列里找出第K小元素,可以用排序算法,然后再找.可以证明,排序算法的上界为O(nlogn). 在这里,给出两种可以在线性时间内找出第K小元素的方法. 方法1: (1) 选定一个比较小的阈值(如 ...

  7. LeetCode 6. ZigZag Conversion Question

    题意:给你一个字符串和行数numRows,要求把该字符串变成一个"之"字形状后,按行数输出该字符串. 例子:"ABCDEFGHIJKLMNO", 4. 该字符串 ...

  8. css hack 兼容性

    做前端多年,虽然不是经常需要hack,但是我们经常会遇到各浏览器表现不一致的情况.基于此,某些情况我们会极不情愿的使用这个不太友好的方式来 达到大家要求的页面表现.我个人是不太推荐使用hack的,要知 ...

  9. LaTeX笔记

    1.上下标: $x^n$, $x^{123}$, $x_n$, $x_{123}$, $C_n^m$, $C_{100}^{50}$ $x^n$, $x^{123}$, $x_n$, $x_{123} ...

  10. Selenium2(webdriver)入门之TestNG的使用

    一.在Eclipse中安装TestNG 1.打开eclipse-->help-->Install New Software-->Add,输入Name和Location后,点击OK. ...