服务端

#!/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消息的更多相关文章

  1. select监听服务端

    # can_read, can_write, _ = select.select(inputs, outputs, None, None)## 第一个参数是我们需要监听可读的套接字, 第二个参数是我们 ...

  2. Rabbitmq无法监听后续消息

    现象: 消息队列在处理完一条消息后,无法继续监听后续消息. 首先,系统启动时要启动接收方法如下: protected void Application_Start() { RouteTable.Rou ...

  3. Hi3559AV100板载开发系列-pthread_create()下V4L2接口MJPEG像素格式的VIDIOC_DQBUF error问题解决-采用阻塞方式下select监听

     最近一直加班加点进行基于Hi3559AV100平台的BOXER-8410AI板载开发,在开发的过程中,遇到了相当多的问题,其一是板载的开发资料没有且功能不完整,厂家不提供太多售后技术支持,厂家对部分 ...

  4. golang监听rabbitmq消息队列任务断线自动重连接

    需求背景: goalng常驻内存任务脚本监听rbmq执行任务 任务脚本由supervisor来管理 当rabbitmq长时间断开连接会出现如下图 进程处于fatal状态 假如因为不可抗拒因素,rabb ...

  5. mqtt实现自动监听服务器消息

    本示例借助meteor的一个环境跑,和我们平时用的node自己搭的环境或java,php的环境本质一样,在此不多讨论. 首先需求是:多系统对接进行消息实时传递. 安装好mqtt:  npm insta ...

  6. 【转】]监听SMS消息/编程实现短信拦截

    当设备接收到一条新的SMS消息时,就会广播一个包含了android.provider.Telephony.SMS_RECEIVED动作的Intent.注意,这个动作是一个字符串值,SDK 1.0不再包 ...

  7. select监听多个client -- linux函数

    使用select函数能够以非堵塞的方式和多个socket通信.程序仅仅是演示select函数的使用,功能很easy,即使某个连接关闭以后也不会改动当前连接数.连接数达到最大值后会终止程序. 1. 程序 ...

  8. layui的select监听

    首先,select一定要放在<form class="layui-form" ></form>里面 然后,加监听<select id="id ...

  9. 监听UDP端口

    功能:监听服务器的UDP端口,输出端口接收的数据 #encoding:utf-8 import socket global udp global ip global port def listen_p ...

随机推荐

  1. zabbix 自动发现端口并添加监控设置

    自动发现端口并添加监控设置UserParameter=net.listen.discovery,sudo /etc/zabbix/scripts/discovery_listport.sh #!/bi ...

  2. Codeforces访问提速攻略(小技巧)

    update 这篇文章已废,因为有了 http://m1.codeforces.com codeforces是不是很慢呢?反正蒟蒻打比赛的时候经常几分钟打不开题面然后就被吊打了... 于是几番周折整理 ...

  3. 【BZOJ5335】[TJOI2018]智力竞赛(二分图匹配)

    [BZOJ5335][TJOI2018]智力竞赛(二分图匹配) 题面 BZOJ 洛谷 题解 假装图不是一个DAG想了半天,.发现并不会做. 于是假装图是一个DAG. 那么显然就是二分答案,然后求一个最 ...

  4. 牛客练习赛40 A 小D的剧场 (思维dp)

    链接:https://ac.nowcoder.com/acm/contest/369/A 题目描述 若你摘得小的星星 你将得到小的幸福  若你摘得大的星星 你将得到大的财富  若两者都能摘得 你将得到 ...

  5. Codeforces Round #516 (Div. 2)D. Labyrinth(BFS)

    题目链接:http://codeforces.com/contest/1064/problem/D 题目大意:给你一个n*m的图,图中包含两种符号,'.'表示可以行走,'*'表示障碍物不能行走,规定最 ...

  6. Typescript学习笔记(一)基础类型

    为了面向ng2和前端未来,开始搞向ts,ts是微软出的一枚语言,作为es6的超集,他出的一些特性还是蛮好用的(略坑).对于我等纯前端(从开始就接触javascript)的人来说,真想说,这特么什么鬼. ...

  7. js jquery 判断元素是否在数组内

    js jquery 判断元素是否在数组内 一,js方法 var arr = ["a", "b", "c"]; // js arr.index ...

  8. bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)

    这题是六省联考的...据说数据还出了点锅,心疼六省选手QAQ 首先要知道扩展欧拉定理... 可以发现每次区间操作都会使模数进行一次phi操作,而一个数最多取logp次phi就会变成1,这时后面的指数就 ...

  9. 洛谷P4219 大融合

    LCT新姿势:维护子树信息. 不能带修,子树修改就要toptree了... 题意:动态加边,求子树大小. 解: 维护子树信息只要额外维护虚边连的儿子的信息即可.这里把siz的定义变成子树大小. 哪里会 ...

  10. Python之函数--命名空间、作用域、global、nonlocal、函数的嵌套和作用域链

    命名空间 -------‘’存放名字与值的关系”的空间 代码在运行伊始,创建的存储“变量名与值的关系”的空间叫做全局命名空间: 在函数的运行中开辟的临时的空间叫做局部命名空间. 命名空间一共分为三种: ...