select监听udp消息
服务端
#!/usr/bin/python2.6
# -*- coding:utf-8 -*- import json
import socket
import select def socketserver():
sock1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock1.bind(('',8090)) # 监听udp的8090端口
sock1.setblocking(1) # 设置为非阻塞模式
sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock2.bind(('0.0.0.0', 8092)) # 监听udp的8092组播端口,组播组设置为 244.1.1.1
status = sock2.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
socket.inet_aton('224.1.1.1') + socket.inet_aton('server IP'))
sock2.setblocking(False) # 设置为非阻塞模式
while True:
rlist,wlist,elist = select.select([sock1, sock2,],[sock1, sock2,],[sock1, sock2,]) # 进行监听
for sock in rlist:
msg = ""
client_msg_json,client_addr = sock.recvfrom(1024)
client_msg = json.loads(client_msg_json)
if sock1 == sock:
msg += "[Unicast] "
elif sock2 == sock:
msg += "[Multicast] "
else:
msg += "[Other] "
msg += 'Client: %s,\t\tInfo: %s' % (client_addr[0]+':'+str(client_addr[1]), client_msg.get('info'))
print msg if __name__ == '__main__':
socketserver()
代码改进:
#!/usr/bin/python2.6
# -*- coding:utf-8 -*- import json
import socket
import select class Request():
def __init__(self,sock,callback):
"""
初始化
:param sock: client's socket
:param callback: callback function
"""
self.sock = sock
self.callback = callback def fileno(self):
return self.sock.fileno() def func1(msg):
print "Unicast %s" % msg def func2(msg):
print "Multicast %s" % msg def socketserver():
sock1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock1.bind(('',8090))
sock1.setblocking(False)
sock2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock2.bind(('0.0.0.0', 8092))
status = sock2.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
socket.inet_aton('224.1.1.1') + socket.inet_aton('server IP'))
sock2.setblocking(False)
obj1 = Request(sock1,func1)
obj2 = Request(sock2,func2)
obj_list = [obj1, obj2,]
while True:
rlist,wlist,elist = select.select(obj_list, obj_list, obj_list)
for obj in rlist:
client_msg_json,client_addr = obj.sock.recvfrom(1024)
client_msg = json.loads(client_msg_json)
obj.callback(client_msg.get('info', '')) if __name__ == '__main__':
socketserver()
普通客户端
#!/usr/bin/python2.6
# -*- coding:utf-8 -*- import json
import time
from socket import * def send_udp():
s = socket(AF_INET,SOCK_DGRAM)
data={'info':'udp msg'}
while True:
s.sendto(json.dumps(data), ('server IP',8090))
print 'Send %s' % data.get('info')
time.sleep(5)
s.close() if __name__ == '__main__':
send_udp()
组播客户端
#!/usr/bin/python2.6
# -*- coding:utf-8 -*- import json
import time
import struct
import socket class MultiCastSend(object):
def __init__(self,senderport=8091,myport=8092,mygroup='224.1.1.1',myttl=5):
self.senderport = senderport
self.myport = myport
self.mygroup = mygroup
self.myttl = myttl
def multicast_send(self,info_dict):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.bind(('client IP', self.senderport))
# Set Time-to-live (optional)
ttl_bin = struct.pack('@i', self.myttl)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl_bin)
status = s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP,
socket.inet_aton(self.mygroup) + socket.inet_aton('client IP'))
s.sendto(json.dumps(info_dict), (self.mygroup, self.myport))
print 'Send %s by multicast.' % info_dict.get('info') if __name__ == '__main__':
mcSend = MultiCastSend()
while True:
mcSend.multicast_send({'info':'mc msg'})
time.sleep(5)
select监听udp消息的更多相关文章
- select监听服务端
# can_read, can_write, _ = select.select(inputs, outputs, None, None)## 第一个参数是我们需要监听可读的套接字, 第二个参数是我们 ...
- Rabbitmq无法监听后续消息
现象: 消息队列在处理完一条消息后,无法继续监听后续消息. 首先,系统启动时要启动接收方法如下: protected void Application_Start() { RouteTable.Rou ...
- Hi3559AV100板载开发系列-pthread_create()下V4L2接口MJPEG像素格式的VIDIOC_DQBUF error问题解决-采用阻塞方式下select监听
最近一直加班加点进行基于Hi3559AV100平台的BOXER-8410AI板载开发,在开发的过程中,遇到了相当多的问题,其一是板载的开发资料没有且功能不完整,厂家不提供太多售后技术支持,厂家对部分 ...
- golang监听rabbitmq消息队列任务断线自动重连接
需求背景: goalng常驻内存任务脚本监听rbmq执行任务 任务脚本由supervisor来管理 当rabbitmq长时间断开连接会出现如下图 进程处于fatal状态 假如因为不可抗拒因素,rabb ...
- mqtt实现自动监听服务器消息
本示例借助meteor的一个环境跑,和我们平时用的node自己搭的环境或java,php的环境本质一样,在此不多讨论. 首先需求是:多系统对接进行消息实时传递. 安装好mqtt: npm insta ...
- 【转】]监听SMS消息/编程实现短信拦截
当设备接收到一条新的SMS消息时,就会广播一个包含了android.provider.Telephony.SMS_RECEIVED动作的Intent.注意,这个动作是一个字符串值,SDK 1.0不再包 ...
- select监听多个client -- linux函数
使用select函数能够以非堵塞的方式和多个socket通信.程序仅仅是演示select函数的使用,功能很easy,即使某个连接关闭以后也不会改动当前连接数.连接数达到最大值后会终止程序. 1. 程序 ...
- layui的select监听
首先,select一定要放在<form class="layui-form" ></form>里面 然后,加监听<select id="id ...
- 监听UDP端口
功能:监听服务器的UDP端口,输出端口接收的数据 #encoding:utf-8 import socket global udp global ip global port def listen_p ...
随机推荐
- 「2017 Multi-University Training Contest 7」2017多校训练7
1002 Build a tree(递归) 题目链接 HDU6121 Build a tree 有一棵n个点的有根树,标号为0到n-1,i号点的父亲是\(\lfloor\frac{i-1}{k}\rf ...
- WC2019 tree
WC2019唯一一道正常的题,考场上没什么想法,也只拿到了暴力分.搞了一天终于做完了. 前置知识:purfer序,多项式exp或分治FTT. 对于\(type=0\)的,随便维护下,算下联通块即可. ...
- Python的快排应有的样子
快排算法 简单来说就是定一个位置然后,然后把比它小的数放左边,比他大的数放右边,这显然是一个递归的定义,根据这个思路很容易可以写出快排的代码 快排是我学ACM路上第一个让我记住的代码,印象很深 ...
- 【BZOJ5291】[BJOI2018]链上二次求和(线段树)
[BZOJ5291][BJOI2018]链上二次求和(线段树) 题面 BZOJ 洛谷 题解 考虑一次询问\([l,r]\)的答案.其中\(S\)表示前缀和 \(\displaystyle \sum_{ ...
- hdu 1527 (威佐夫博弈)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 Problem Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石 ...
- 初入react-redux (基于webpack babel的react应用框架)
react这么热门的框架也不介绍了,redux是一个单项数据流的小框架,当然不只配合react,它起初是为react而配的,现在面向所有了,比如ng-redux的项目.redux做为react的标准搭 ...
- BZOJ 1054: [HAOI2008]移动玩具(bfs)
题面: https://www.lydsy.com/JudgeOnline/problem.php?id=1054 题解: 将每一种状态十六位压成二进制,然后bfs..不解释.. p.s.注意特判初始 ...
- sh: /etc/init.d/sshd: not found Docker中的Alpine镜像安装sshd无法启动
问题描述 在Alpine镜像中安装了openssh-server和openssh之后,无法执行ssh localhost.发现未启动服务,开启服务时报以下错误 / # ls /etc/init.d/s ...
- vue2.0项目实战(2)使用 vue-cli 搭建项目
Vue-cli是官方推荐的快速构建单页应用的脚手架.官方给的建议,如果你是初次尝试Vue,哪就老老实实用普通的书写引入js文件,这里牵扯太多的东西,例如webpack .npm .nodejs 等等, ...
- Python之黏包
黏包现象 让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) res=subprocess.Popen(cmd.decode('utf-8'), shell ...