服务端

#!/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. 【转】SEGGER Embedded Studio 新建stm32f103工程

    @2018-12-22 SEGGER Embedded Studio 新建stm32f103工程

  2. Palindrome Function HDU - 6156(数位dp)

    要求m-n内在l-r进制下的是回文数的总个数. dp[进制][从第j为开始][目前到达第k位] = 总的方案数 dfs枚举目前的到达的位置,这个数开始的位置,进制,前导零,限制条件,然后枚举的时候如果 ...

  3. tvs二极管应用电路

    瞬态电压抑制器(TVS)具有响应时间快.瞬态功率大.漏电流低.击穿电压偏差小.箝位电压较易控制.无损坏极限.体积小等优点.目前已广泛应用于计算机系统.通讯设备.交/直流电源.汽车.家用电器.仪器仪表等 ...

  4. 牛客练习赛43 Tachibana Kanade Loves Probability(快速幂)

    链接:https://ac.nowcoder.com/acm/contest/548/B来源:牛客网 题目描述 立华奏在学习初中数学的时候遇到了这样一道大水题: “设箱子内有 n 个球,其中给 m 个 ...

  5. Servlet -- 重定向

    重定向的两种方式: 1: protected void doGet(HttpServletRequest request, HttpServletResponse response) throws S ...

  6. mysql connections

    在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to MySQL server. Too many connections”-mysql 1040错误,这是 ...

  7. js jquery 遍历 for,while,each,map,grep

    js jquery 遍历 一,for循环. // 第一种var arr = [1, 2, 3];for(var i = 0; i < arr.length; i++) { console.log ...

  8. A1124. Raffle for Weibo Followers

    John got a full mark on PAT. He was so happy that he decided to hold a raffle(抽奖) for his followers ...

  9. Django(九)admin相关知识

    https://www.cnblogs.com/yuanchenqi/articles/6083427.htm https://www.cnblogs.com/haiyan123/p/8034430. ...

  10. 记一次 HTTP信息头管理器使用 的重要性

    今天在测试中遇到了一个问题 使用JMeter时请求相关地址参数及方法都填写正确,但是相应数据返回始终不对,例如 查看取样器结果显示 200 正常,但响应数据不符合正常的结果. 经反复检查发现问题如下: ...