udp server

#!/usr/bin/env python
#-*- coding:utf-8 -*- import socket
import select
import Queue #创建socket对象
serversocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#设置IP地址复用
#serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
#ip地址和端口号
server_address = ("127.0.0.1", 50000)
#绑定IP地址
serversocket.bind(server_address)
print "服务器启动成功,监听IP:" , server_address
#服务端设置非阻塞
#serversocket.setblocking(False)
#超时时间
timeout = 10 #创建epoll事件对象,后续要监控的事件添加到其中
epoll = select.epoll()
#注册服务器监听fd到等待读事件集合
print "serversocket.fileno():%s" % serversocket.fileno()
epoll.register(serversocket.fileno(), select.EPOLLIN) #文件句柄到所对应对象的字典,格式为{句柄:对象}
fd_to_socket = {serversocket.fileno():serversocket,} print "select.EPOLLIN:%s" % select.EPOLLIN
print "select.EPOLLOUT:%s" % select.EPOLLOUT
print "select.EPOLLHUP:%s" % select.EPOLLHUP while True:
#轮询注册的事件集合,返回值为[(文件句柄,对应的事件),(...),....]
events = epoll.poll(timeout)
if not events:
print "epoll超时无活动连接,重新轮询......"
continue
print "有" , len(events), "个新事件,开始处理......" for fd, event in events:
socket = fd_to_socket[fd]
print "fd:%s, socket:%s, event:%s" % (fd, socket, event) #可读事件
if event & select.EPOLLIN:
#接收数据
#data = socket.recv(1024)
data, addr = socket.recvfrom(1024)
if data:
print "收到数据:" , data
#修改读取到消息的连接到等待写事件集合(即对应客户端收到消息后,再将其fd修改并加入写事件集合)
#epoll.modify(fd, select.EPOLLOUT)
socket.sendto(data, addr)
else:
print 'client close'
#在epoll中注销客户端的文件句柄
epoll.unregister(fd)
#关闭客户端的文件句柄
fd_to_socket[fd].close()
#在字典中删除与已关闭客户端相关的信息
del fd_to_socket[fd]
#epoll.modify(fd, select.EPOLLHUP)
#关闭事件
elif event & select.EPOLLHUP:
print 'client close'
#在epoll中注销客户端的文件句柄
epoll.unregister(fd)
#关闭客户端的文件句柄
fd_to_socket[fd].close()
#在字典中删除与已关闭客户端相关的信息
del fd_to_socket[fd] #在epoll中注销服务端文件句柄
epoll.unregister(serversocket.fileno())
#关闭epoll
epoll.close()
#关闭服务器socket
serversocket.close()

udp client

#!/usr/bin/env python
#-*- coding:utf-8 -*- import socket #创建客户端socket对象
clientsocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#服务端IP地址和端口号元组
server_address = ('127.0.0.1',50000)
#客户端连接指定的IP地址和端口号
#clientsocket.connect(server_address) while True:
#输入数据
data = raw_input('please input:')
#客户端发送数据
print "send to ..."
clientsocket.sendto(data, ('127.0.0.1',50000))
#客户端接收数据
print "receive from ..."
server_data = clientsocket.recv(1024)
print '客户端收到的数据:%s' % server_data

使用epoll实现一个udp server && client的更多相关文章

  1. epoll简介 与 UDP server的实现

    Abstractepoll是Linux内核为处理大批量句柄而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著减少程序在大量并发连接中只有少量活跃的情况下的系 ...

  2. UDP server & client

    Server: import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; ...

  3. linux+udp+server+client

    一.客户端 #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include ...

  4. uip UDP server广播模式(client能够随意port,而且主动向client发送数据)

    眼下移植uip,发现UDP server模式下,必须指定本地port以及clientport,否则仅仅能讲clientport设置为0,才干接收随意port的数据,可是无法发送数据,由于此时clien ...

  5. Tinyhttpd - 超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client(Qt也有很多第三方HTTP类)

    - 2. Tinyhttpd tinyhttpd是一个超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client,可以通过阅读这段代码理解一个 Htt ...

  6. TCP/UDP Socket调试工具提供了TCP Server,TCP Client,UDP Server,UDP Client,UDP Group 五种Socket调试方案。

    一.TCP通信测试: 1)   创建TCP Server: 选中左方的TCP Server, 然后点击”创建”按钮,软件弹出监听端口输入框 输入监听端口后,即创建了一个在指定端口上进行监听的TCP S ...

  7. UDP client,UDP server, TCP server, TCP client

    UDP server import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocke ...

  8. NetMQ(ZeroMQ)Client => Server => Client 模式的实现

    ØMQ (也拼写作ZeroMQ,0MQ或ZMQ)是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库.它提供一个消息队列, 但是与面向消息的中间件不同,ZeroMQ的运行不需要专门的消息代理(m ...

  9. php创建udp Server

    <?php//服务器信息$server = 'udp://127.0.0.1:7002';//----UDP Server$msgEof = "\n";$socket = s ...

随机推荐

  1. 201671010418 刘佳 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 (1)掌握软件项目评审会流程: (2)反思总结课程学习内容. Start: ...

  2. 项目Beta冲刺(团队) —— 凡事预则立

    1.讨论组长是否重选的议题和结论 讨论: 我们采取匿名群投票的方式进行 投票结果如下: 成员共7人 投票7人 投票率100% 结果有效 结论: 不需要重选组长 2.下一阶段需要改进完善的功能 完善游戏 ...

  3. RemoveError: 'setuptools' is a dependency of conda and cannot be removed from conda's operating environment.

    今天用conda install 任何包都会出现这个错误: RemoveError: 'setuptools' is a dependency of conda and cannot be remov ...

  4. 为什么 JVM 不用 JIT 全程编译?

    考虑到跨平台,所以无法使用AOT: 考虑到执行效率,所以无法全部使用JIT: 编译技术大约分为两种,一种AOT,只线下(offline)就将源代码编译成目标机器码,这是普遍用在系统程序语言中:另一种是 ...

  5. input标签中的accpet

    用法 accept 属性只能与 <input type="file"> 配合使用.它规定能够通过文件上传进行提交的文件类型. 提示:请避免使用该属性.应该在服务器端验证 ...

  6. codeforces B. A and B 找规律

    Educational Codeforces Round 78 (Rated for Div. 2) 1278B - 6 B. A and B  time limit per test 1 secon ...

  7. leetcode 数据库练习 - 1205 每月交易I和II

    每月交易(一) Table: Transactions +---------------+---------+| Column Name | Type |+---------------+------ ...

  8. 关于windows10用c++部署libtorch过程中遇到的一些问题

    libtorch1.0 vs2017 CMake3.14 windows10 无cuda 用c++调用pytorch模型官网上面有详细教程,也有很多博客,可以参考以下链接:https://blog.c ...

  9. JWT了解与实战

    最近在使用JWT做一个单点登录与接口鉴权的功能,正好可以对JWT有深一步的了解. 一.JWT使用场景: 1. 授权:用户登录后,每个请求都包含JWT,允许用户访问该令牌允许的路由.服务和资源.单点登录 ...

  10. js数组reduce()方法的使用和一些应用场景

    reduce()的使用 reduce()方法为归并类方法,最常见的应用场景就是,计算数组中每一项的总和. reduce()方法会遍历数组的每一项,它接收两个参数: 第一个参数是:每次遍历都会调用的函数 ...