服务端

#!/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. python学习日记(流程控制习题)

    请输出1-2+3...+99除88以外的和 i = 1 sum = 0 while i <= 99: if i == 88: i = i + 1 continue else: if i%2 == ...

  2. Python变量与赋值

    Python是一门独特的语言,与C语言有很大区别,初学Python很多萌新表示对变量与赋值不理解,学过C的都知道,给变量赋值时,需要先指定数据类型,同时会开辟一块内存区域,用于存储值,例如: int ...

  3. 新建WINDOWS服务C#

    当前作业环境 Windows8.1 | Visual Studio 2013 一. 建立项目,选择"Windows服务"模板 二. 查看生成的项目,结构很像WinForm的项目,其 ...

  4. 「NOI2014」购票 解题报告

    「NOI2014」购票 写完了后发现写的做法是假的...然后居然过了,然后就懒得管正解了. 发现需要维护凸包,动态加点,询问区间,强制在线 可以二进制分组搞,然后你发现在树上需要资瓷撤回,然后暴力撤回 ...

  5. HR_Minimum Swaps 2

    源代码超时 看了评论区改用了字典序列. #!/bin/python3 import math import os import random import re import sys # Comple ...

  6. mysql慢查询,死锁解决方案

    1. 先使用root用户登录到MySQL中 2. 使用show processlist查看其查询速率 +----+------+-----------------+------+---------+- ...

  7. A1021. Deepest Root

    A graph which is connected and acyclic can be considered a tree. The height of the tree depends on t ...

  8. python 当前时间获取方法

    1.先导入库:import datetime 2.获取当前日期和时间:now_time = datetime.datetime.now() 3.格式化成我们想要的日期:strftime() 比如:“2 ...

  9. 关于PHP的 PHP-FPM进程CPU 100%的一些原因分析和解决方案

    之前碰到过php-fpmCPU高达80%-90%,特此记录下 1. 查看是否是硬件问题 方式:top  命令 主要查看:load average(平均负载),这是一个4核8G内存的服务器 1分钟平均负 ...

  10. Python函数--装饰器进阶

    开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封 ...