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. the smallest positive number

    2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any rema ...

  2. assets文件夹资源的访问

    访问assets文件夹中的文件,分为以下几个步骤:1.在Activity里面调用getAssets(),获取AssetManager引用2.调用AssetManager.open(String fil ...

  3. wifi10db定向天线制作及应注意的问题

    2.4GHZ本身就是高频要求制作精度高,如果您动手能力差的话还是不要做的好许多网友看到网上的制作资料就急不可耐的去找材料,然后加班加点的制作.等做出了天线发现效果不怎么样,或出了这样和那样的问题,才肯 ...

  4. QT中异形窗口的绘制(winEvent处理WM_NCHITTEST消息)

    这里讨论的只是Windows平台上的实现. 在QT中绘制异形窗口,只要设定 windowFlag 为 CustomizeWindowHint,再结合setMask()就可以做出各种奇形怪状的窗口.相对 ...

  5. Skipped Rebuild All: Project with VS2008

    This Problem is getting me head around it in these days. BUt , i have solve it: Description of Probl ...

  6. FE: Responsive Web Design Overview

    布局特点 1. 单列布局 vs 水平布局 手机屏幕宽度较小,因此多采用单列布局.    反观桌面网页设计,为了利用宽度,往往使用各种水平布局的组件,诸如水平导航栏,水平按钮组,水平分页等.然而水平布局 ...

  7. sql Sever 修改表中的列名

    EXEC SP_RENAME 'LeInterface.iYear','iLeYear','COLUMN' EXEC SP_RENAME 'LeInterface.imonth','iLemonth' ...

  8. javascript中子类如何继承父类

    参考阮一峰的文章:http://javascript.ruanyifeng.com/oop/inheritance.html#toc4 function Shape() { this.x = 0; t ...

  9. 【BUG】Kewastunpackstats(): Bad Magic 1 (0x。。。。, 0)

    Kewastunpackstats(): Bad Magic 1 (0x1108f7b87, 0) In Alert Logfile After Upgrading to 11.2.0.1 Appli ...

  10. Android 字体设置

    Android 对中文字体支持很不好~~ 需要加入相应的字体库 (1)创建布局Layout //创建线性布局 LinearLayout linearLayout=newLinearLayout(thi ...