仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 826|回复: 9
打印 上一主题 下一主题

[CentOS(社区)] 带来一篇python中利用epoll开辟办事端步伐

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 21:16:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
小知识:CentOS其实就是相当于免费版的RedHat,任何人可以自由使用,不需要向RedHat付任何的费用。当然,同样你也得不到任何有偿的技术支持和升级服务。
Python代码:

importsocket,logging
importselect,errno

logger=logging.getLogger("network-server")

defInitLog():
logger.setLevel(logging.DEBUG)

fh=logging.FileHandler("network-server.log")
fh.setLevel(logging.DEBUG)
ch=logging.StreamHandler()
ch.setLevel(logging.ERROR)

formatter=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s")
ch.setFormatter(formatter)
fh.setFormatter(formatter)

logger.addHandler(fh)
logger.addHandler(ch)


if__name__=="__main__":
InitLog()

try:
listen_fd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
exceptsocket.error,msg:
logger.error("createasocketfailed")

try:
listen_fd.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
exceptsocket.error,msg:
logger.error("setsocketopterror")

try:
listen_fd.bind((,2003))
exceptsocket.error,msg:
logger.error("listenfileidbindiperror")

try:
listen_fd.listen(10)
exceptsocket.error,msg:
logger.error(msg)

try:
epoll_fd=select.epoll()
epoll_fd.register(listen_fd.fileno(),select.EPOLLIN)
exceptselect.error,msg:
logger.error(msg)

connections={}
addresses={}
datalist={}
whileTrue:
epoll_list=epoll_fd.poll()
forfd,eventsinepoll_list:
iffd==listen_fd.fileno():
conn,addr=listen_fd.accept()
logger.debug("acceptconnectionfrom%s,%d,fd=%d"%(addr[0],addr[1],conn.fileno()))
conn.setblocking(0)
epoll_fd.register(conn.fileno(),select.EPOLLIN|select.EPOLLET)
connections[conn.fileno()]=conn
addresses[conn.fileno()]=addr
elifselect.EPOLLIN&events:
datas=
whileTrue:
try:
data=connections[fd].recv(10)
ifnotdataandnotdatas:
epoll_fd.unregister(fd)
connections[fd].close()
logger.debug("%s,%dclosed"%(addresses[fd][0],addresses[fd][1]))
break
else:
datas+=data
exceptsocket.error,msg:
ifmsg.errno==errno.EAGAIN:
logger.debug("%sreceive%s"%(fd,datas))
datalist[fd]=datas
epoll_fd.modify(fd,select.EPOLLET|select.EPOLLOUT)
break
else:
epoll_fd.unregister(fd)
connections[fd].close()
logger.error(msg)
break
elifselect.EPOLLHUP&events:
epoll_fd.unregister(fd)
connections[fd].close()
logger.debug("%s,%dclosed"%(addresses[fd][0],addresses[fd][1]))
elifselect.EPOLLOUT&events:
sendLen=0
whileTrue:
sendLen+=connections[fd].send(datalist[fd][sendLen:])
ifsendLen==len(datalist[fd]):
break
epoll_fd.modify(fd,select.EPOLLIN|select.EPOLLET)
else:
continue


客户端步伐,Python代码:

importsocket
importtime
importlogging

logger=logging.getLogger("network-client")
logger.setLevel(logging.DEBUG)

fh=logging.FileHandler("network-client.log")
fh.setLevel(logging.DEBUG)
ch=logging.StreamHandler()
ch.setLevel(logging.ERROR)

formatter=logging.Formatter("%(asctime)s-%(name)s-%(levelname)s-%(message)s")
ch.setFormatter(formatter)
fh.setFormatter(formatter)

logger.addHandler(fh)
logger.addHandler(ch)

if__name__=="__main__":
try:
connFd=socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
exceptsocket.error,msg:
logger.error(msg)

try:
connFd.connect(("192.168.31.226",2003))
logger.debug("connecttonetworkserversuccess")
exceptsocket.error,msg:
logger.error(msg)

foriinrange(1,11):
data="TheNumberis%d"%i
ifconnFd.send(data)!=len(data):
logger.error("senddatatonetworkserverfailed")
break
readData=connFd.recv(1024)
printreadData
time.sleep(1)

connFd.close()



这是个很复杂的C/S模子的步伐,流程实在和C言语相差不年夜,就是为了学学python中的基础语法,和logging,select,socket模块的利用。客户端发送字符串,办事端再将该字符串前往客户端,epoll中利用的边沿触发。
这个有一篇很威望的文章讲这个
http://scotdoyle.com/python-epoll-howto.html



小知识:在过去的四年中,我经常使用CentOS,主要是作为企业Linux商业版本产品的一种替代,很多个人、企业或机构都希望拥有主流企业Linux的稳定性、可靠性和声誉。
兰色精灵 该用户已被删除
沙发
发表于 2015-1-15 08:20:24 | 只看该作者

带来一篇python中利用epoll开辟办事端步伐

大致看明白了,楼主的思维太过发散、太过跳跃了。楼主,加强集中精力叙述一件事情的能力。不要再发散了……
爱飞 该用户已被删除
板凳
发表于 2015-1-17 16:06:10 来自手机 | 只看该作者
为了更好的学习这门课程,我不仅课上认真听讲,课下也努力学习,为此还在自己的电脑上安装了Ubuntu系统。
老尸 该用户已被删除
地板
发表于 2015-1-26 20:11:48 | 只看该作者
其实老师让写心得我也没怎么找资料应付,自己想到什么就写些什么,所以不免有些凌乱;很少提到编程,因为那些在实验报告里已经说了,这里再写就多余了。
山那边是海 该用户已被删除
5#
发表于 2015-2-5 01:19:48 | 只看该作者
老实说,第一个程序是在C中编译好的,调试好了才在Linux下运行,感觉用vi比较麻烦,因为有错了不能调试,只是提示错误。
飘灵儿 该用户已被删除
6#
发表于 2015-2-11 01:57:58 | 只看该作者
Linux简单,占内存少,特别是对于程序开发人员来说很方便,如果说windows的成功在于其方便用户的窗口管理界面。
谁可相欹 该用户已被删除
7#
发表于 2015-3-1 20:02:22 | 只看该作者
我感觉linux的学习,学习编程~!~!就去学习C语言编程!!
若相依 该用户已被删除
8#
发表于 2015-3-11 01:25:16 | 只看该作者
查阅经典工具书和Howto,特别是Howto是全球数以万计的Linux、Unix的经验总结非常有参考价值通常40%的问题同样可以解决。
乐观 该用户已被删除
9#
发表于 2015-3-17 20:08:13 | 只看该作者
学习Linux半年了~个人认为不会的多在网上找资料网上有很多资料可以搜索到,LS那位说放手去搞。
愤怒的大鸟 该用户已被删除
10#
发表于 2015-3-25 02:50:14 | 只看该作者
笔者五分钟后就给出了解决方法: “首先备份原文件到其他目录,然后删掉/usr/local/unispim/unispimsp.ksc,编辑 /usr/local/unispim/unispimsp.ini,最后重启动计算机
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 04:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表