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 ...
随机推荐
- Hdoj 2050.折线分割平面 题解
Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面 ...
- 20165223 《JAVA程序设计》第四周学习总结
20165223 <JAVA程序设计>第四周学习总结 教材学习内容总结 第五章要点 子类与继承 成员变量的隐藏和方法重写 super关键字 继承与多态 abstract类与abstract ...
- 51nod 1005 1027 1029 高精度
Java大数用法参考:https://www.cnblogs.com/jin-nuo/p/5313205.html 1005 大数加法: import java.util.*; import java ...
- Anaconda For Linux (附C#交互式编程的引入)
汇总系列:https://www.cnblogs.com/dunitian/p/4822808.html#ai Jupyter美化: https://www.cnblogs.com/dotnetcra ...
- (1)Phonics自然拼读 英语动画 Fun with Phonics 国际主流英语教学法
Phonics(拼音英语)是目前国际主流的英语教学法,我国香港和台湾地区2000年就已引进此教学法,并已进入大规模推广和普及阶段.它之所以风靡全球,是因为这种教学法简单高效,符合人类学习语言的规律,尤 ...
- ArcGIS for qml -测距
源码:https://github.com/sueRimn/ArcGIS-for-qml-demos 实现求地图上两点之间距离功能 作者: 狐狸家的鱼 Github: 八至 版权声明:如需转载,请联系 ...
- poj3630 Phone List
spy on一下,发现是trie裸题,结果一交就T... 然后把cin改成scanf就A了... trie的空间一定要开足,要不然RE #include <cstdio> #include ...
- Day18--Python--面向对象--类与类之间的关系
1. 依赖关系 在方法中引入另一个类的对象 (最不紧密的一种关系) 依赖关系都是把另一个对象当做参数 class Elephant: def __init__(self, name): self.na ...
- typescript和coffeescript简介
typescript 1.什么是typescript?和JavaScript有什么关系? 1.它是一门独立的语言,实现了自己的编译器 2.它的目标代码是JavaScript(很多语言的目标代码是机 ...
- IIS异常:CS0016: 未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\.。。”--“拒绝访问
CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/.........dll” ...